├── .gitignore
├── examples
├── README
├── Relative_Channel_Test.py
├── Static_Channel_Test.grc
└── Relative_Channel_Test.grc
├── docs
├── doxygen
│ ├── other
│ │ ├── group_defs.dox
│ │ └── main_page.dox
│ ├── doxyxml
│ │ ├── generated
│ │ │ ├── __init__.py
│ │ │ └── index.py
│ │ ├── text.py
│ │ ├── __init__.py
│ │ ├── doxyindex.py
│ │ └── base.py
│ ├── CMakeLists.txt
│ └── swig_doc.py
├── README.vlc
└── CMakeLists.txt
├── grc
├── vlc_channel_fixed.xml
├── vlc_channel_static.xml
├── CMakeLists.txt
└── vlc_channel_relative.xml
├── swig
├── vlc_swig.i
└── CMakeLists.txt
├── MANIFEST.md
├── README.md
├── cmake
├── Modules
│ ├── vlcConfig.cmake
│ ├── FindCppUnit.cmake
│ ├── FindGnuradioRuntime.cmake
│ ├── GrPlatform.cmake
│ ├── GrTest.cmake
│ ├── CMakeParseArgumentsCopy.cmake
│ ├── GrPython.cmake
│ ├── GrSwig.cmake
│ └── UseSWIG.cmake
└── cmake_uninstall.cmake.in
├── apps
└── CMakeLists.txt
├── include
└── vlc
│ ├── api.h
│ ├── CMakeLists.txt
│ ├── channel_fixed.h
│ ├── channel_static.h
│ └── channel_relative.h
├── lib
├── qa_vlc.cc
├── qa_vlc.h
├── channel_fixed_impl.h
├── test_vlc.cc
├── channel_static_impl.h
├── channel_relative_impl.h
├── channel_fixed_impl.cc
├── channel_static_impl.cc
├── CMakeLists.txt
└── channel_relative_impl.cc
├── python
├── __init__.py
├── build_utils_codes.py
├── CMakeLists.txt
├── qa_channel_fixed.py
├── qa_channel_static.py
├── qa_channel_relative.py
└── build_utils.py
└── CMakeLists.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | build/*
2 | *~
3 |
--------------------------------------------------------------------------------
/examples/README:
--------------------------------------------------------------------------------
1 | It is considered good practice to add examples in here to demonstrate the
2 | functionality of your OOT module. Python scripts, GRC flow graphs or other
3 | code can go here.
4 |
5 |
--------------------------------------------------------------------------------
/docs/doxygen/other/group_defs.dox:
--------------------------------------------------------------------------------
1 | /*!
2 | * \defgroup block GNU Radio VLC C++ Signal Processing Blocks
3 | * \brief All C++ blocks that can be used from the VLC GNU Radio
4 | * module are listed here or in the subcategories below.
5 | *
6 | */
7 |
8 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/generated/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Contains generated files produced by generateDS.py.
3 |
4 | These do the real work of parsing the doxygen xml files but the
5 | resultant classes are not very friendly to navigate so the rest of the
6 | doxyxml module processes them further.
7 | """
8 |
--------------------------------------------------------------------------------
/docs/doxygen/other/main_page.dox:
--------------------------------------------------------------------------------
1 | /*! \mainpage
2 |
3 | Welcome to the GNU Radio VLC Block
4 |
5 | This is the intro page for the Doxygen manual generated for the VLC
6 | block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
7 | documentation about the new GNU Radio modules contained in this
8 | project.
9 |
10 | */
11 |
--------------------------------------------------------------------------------
/docs/README.vlc:
--------------------------------------------------------------------------------
1 | This is the vlc-write-a-block package meant as a guide to building
2 | out-of-tree packages. To use the vlc blocks, the Python namespaces
3 | is in 'vlc', which is imported as:
4 |
5 | import vlc
6 |
7 | See the Doxygen documentation for details about the blocks available
8 | in this package. A quick listing of the details can be found in Python
9 | after importing by using:
10 |
11 | help(vlc)
12 |
--------------------------------------------------------------------------------
/grc/vlc_channel_fixed.xml:
--------------------------------------------------------------------------------
1 |
2 | VLC Channel - Fixed
3 | vlc_channel_fixed
4 | [VLC]/Channel Model
5 | import vlc
6 | vlc.channel_fixed($gain)
7 |
8 | Gain
9 | gain
10 | float
11 |
12 |
13 | in
14 | float
15 |
16 |
17 | out
18 | float
19 |
20 |
21 |
--------------------------------------------------------------------------------
/swig/vlc_swig.i:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 |
3 | #define VLC_API
4 |
5 | %include "gnuradio.i" // the common stuff
6 |
7 | //load generated python docstrings
8 | %include "vlc_swig_doc.i"
9 |
10 | %{
11 | #include "vlc/channel_fixed.h"
12 | #include "vlc/channel_static.h"
13 | #include "vlc/channel_relative.h"
14 | %}
15 |
16 |
17 | %include "vlc/channel_fixed.h"
18 | GR_SWIG_BLOCK_MAGIC2(vlc, channel_fixed);
19 | %include "vlc/channel_static.h"
20 | GR_SWIG_BLOCK_MAGIC2(vlc, channel_static);
21 | %include "vlc/channel_relative.h"
22 | GR_SWIG_BLOCK_MAGIC2(vlc, channel_relative);
23 |
24 |
--------------------------------------------------------------------------------
/MANIFEST.md:
--------------------------------------------------------------------------------
1 | title: The VLC OOT Module
2 | brief: Short description of gr-vlc
3 | tags: # Tags are arbitrary, but look at CGRAN what other authors are using
4 | - sdr
5 | author:
6 | - Author Name
7 | copyright_owner:
8 | - Copyright Owner 1
9 | license:
10 | #repo: # Put the URL of the repository here, or leave blank for default
11 | #website: # If you have a separate project website, put it here
12 | #icon: # Put a URL to a square image here that will be used as an icon on CGRAN
13 | ---
14 | A longer, multi-line description of gr-vlc.
15 | You may use some *basic* Markdown here.
16 | If left empty, it will try to find a README file instead.
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # gr-vlc
2 | GNURadio OOT block for visible light communication (i.e., LiFi)
3 |
4 |
5 | To install, follow the steps below:
6 |
7 | 1-) cd to the gr-vlc directory
8 |
9 | 2-) Create a build directory with 'mkdir build' and move into the directory with 'cd build/'
10 |
11 | 3-) Run cmake with the path to your local gnuradio installation (assuming installed via PyBOMBS):
12 | 'cmake -DCMAKE_INSTALL_PREFIX= ../'
13 |
14 | 4-) Run 'make'
15 |
16 | 5-) Test the build with 'make test' (shouldn't be any failures)
17 |
18 | 6-) Install with 'make install'
19 |
20 | 7-) Configure your linker/debugger with 'sudo ldconfig'
21 |
22 | 8-) Open gnuradio-companion and you should find a module for VLC. You can test the grc flowgraph(s) in ./examples to check functionality.
23 |
--------------------------------------------------------------------------------
/grc/vlc_channel_static.xml:
--------------------------------------------------------------------------------
1 |
2 | VLC Channel - Static
3 | vlc_channel_static
4 | [VLC]/Channel Model
5 | import vlc
6 | vlc.channel_static($emission_angle, $acceptance_angle, $distance)
7 |
8 | Emission_angle
9 | emission_angle
10 | float
11 |
12 |
13 | Acceptance_angle
14 | acceptance_angle
15 | float
16 |
17 |
18 | Distance
19 | distance
20 | float
21 |
22 |
23 | in
24 | float
25 |
26 |
27 | out
28 | float
29 |
30 |
31 |
--------------------------------------------------------------------------------
/cmake/Modules/vlcConfig.cmake:
--------------------------------------------------------------------------------
1 | INCLUDE(FindPkgConfig)
2 | PKG_CHECK_MODULES(PC_VLC vlc)
3 |
4 | FIND_PATH(
5 | VLC_INCLUDE_DIRS
6 | NAMES vlc/api.h
7 | HINTS $ENV{VLC_DIR}/include
8 | ${PC_VLC_INCLUDEDIR}
9 | PATHS ${CMAKE_INSTALL_PREFIX}/include
10 | /usr/local/include
11 | /usr/include
12 | )
13 |
14 | FIND_LIBRARY(
15 | VLC_LIBRARIES
16 | NAMES gnuradio-vlc
17 | HINTS $ENV{VLC_DIR}/lib
18 | ${PC_VLC_LIBDIR}
19 | PATHS ${CMAKE_INSTALL_PREFIX}/lib
20 | ${CMAKE_INSTALL_PREFIX}/lib64
21 | /usr/local/lib
22 | /usr/local/lib64
23 | /usr/lib
24 | /usr/lib64
25 | )
26 |
27 | INCLUDE(FindPackageHandleStandardArgs)
28 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(VLC DEFAULT_MSG VLC_LIBRARIES VLC_INCLUDE_DIRS)
29 | MARK_AS_ADVANCED(VLC_LIBRARIES VLC_INCLUDE_DIRS)
30 |
31 |
--------------------------------------------------------------------------------
/apps/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | include(GrPython)
21 |
22 | GR_PYTHON_INSTALL(
23 | PROGRAMS
24 | DESTINATION bin
25 | )
26 |
--------------------------------------------------------------------------------
/grc/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | install(FILES
21 | vlc_channel_fixed.xml
22 | vlc_channel_static.xml
23 | vlc_channel_relative.xml
24 | DESTINATION share/gnuradio/grc/blocks
25 | )
26 |
--------------------------------------------------------------------------------
/include/vlc/api.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2011 Free Software Foundation, Inc.
3 | *
4 | * This file is part of GNU Radio
5 | *
6 | * GNU Radio is free software; you can redistribute it and/or modify
7 | * it under the terms of the GNU General Public License as published by
8 | * the Free Software Foundation; either version 3, or (at your option)
9 | * any later version.
10 | *
11 | * GNU Radio is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with GNU Radio; see the file COPYING. If not, write to
18 | * the Free Software Foundation, Inc., 51 Franklin Street,
19 | * Boston, MA 02110-1301, USA.
20 | */
21 |
22 | #ifndef INCLUDED_VLC_API_H
23 | #define INCLUDED_VLC_API_H
24 |
25 | #include
26 |
27 | #ifdef gnuradio_vlc_EXPORTS
28 | # define VLC_API __GR_ATTR_EXPORT
29 | #else
30 | # define VLC_API __GR_ATTR_IMPORT
31 | #endif
32 |
33 | #endif /* INCLUDED_VLC_API_H */
34 |
--------------------------------------------------------------------------------
/include/vlc/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011,2012 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Install public header files
22 | ########################################################################
23 | install(FILES
24 | api.h
25 | channel_fixed.h
26 | channel_static.h
27 | channel_relative.h
28 | DESTINATION include/vlc
29 | )
30 |
--------------------------------------------------------------------------------
/lib/qa_vlc.cc:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2012 Free Software Foundation, Inc.
3 | *
4 | * This file is part of GNU Radio
5 | *
6 | * GNU Radio is free software; you can redistribute it and/or modify
7 | * it under the terms of the GNU General Public License as published by
8 | * the Free Software Foundation; either version 3, or (at your option)
9 | * any later version.
10 | *
11 | * GNU Radio is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with GNU Radio; see the file COPYING. If not, write to
18 | * the Free Software Foundation, Inc., 51 Franklin Street,
19 | * Boston, MA 02110-1301, USA.
20 | */
21 |
22 | /*
23 | * This class gathers together all the test cases for the gr-filter
24 | * directory into a single test suite. As you create new test cases,
25 | * add them here.
26 | */
27 |
28 | #include "qa_vlc.h"
29 |
30 | CppUnit::TestSuite *
31 | qa_vlc::suite()
32 | {
33 | CppUnit::TestSuite *s = new CppUnit::TestSuite("vlc");
34 |
35 | return s;
36 | }
37 |
--------------------------------------------------------------------------------
/cmake/Modules/FindCppUnit.cmake:
--------------------------------------------------------------------------------
1 | # http://www.cmake.org/pipermail/cmake/2006-October/011446.html
2 | # Modified to use pkg config and use standard var names
3 |
4 | #
5 | # Find the CppUnit includes and library
6 | #
7 | # This module defines
8 | # CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
9 | # CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
10 | # CPPUNIT_FOUND, If false, do not try to use CppUnit.
11 |
12 | INCLUDE(FindPkgConfig)
13 | PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
14 |
15 | FIND_PATH(CPPUNIT_INCLUDE_DIRS
16 | NAMES cppunit/TestCase.h
17 | HINTS ${PC_CPPUNIT_INCLUDE_DIR}
18 | ${CMAKE_INSTALL_PREFIX}/include
19 | PATHS
20 | /usr/local/include
21 | /usr/include
22 | )
23 |
24 | FIND_LIBRARY(CPPUNIT_LIBRARIES
25 | NAMES cppunit
26 | HINTS ${PC_CPPUNIT_LIBDIR}
27 | ${CMAKE_INSTALL_PREFIX}/lib
28 | ${CMAKE_INSTALL_PREFIX}/lib64
29 | PATHS
30 | ${CPPUNIT_INCLUDE_DIRS}/../lib
31 | /usr/local/lib
32 | /usr/lib
33 | )
34 |
35 | LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
36 |
37 | INCLUDE(FindPackageHandleStandardArgs)
38 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
39 | MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
40 |
--------------------------------------------------------------------------------
/python/__init__.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2008,2009 Free Software Foundation, Inc.
3 | #
4 | # This application is free software; you can redistribute it and/or modify
5 | # it under the terms of the GNU General Public License as published by
6 | # the Free Software Foundation; either version 3, or (at your option)
7 | # any later version.
8 | #
9 | # This application is distributed in the hope that it will be useful,
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | # GNU General Public License for more details.
13 | #
14 | # You should have received a copy of the GNU General Public License along
15 | # with this program; if not, write to the Free Software Foundation, Inc.,
16 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 | #
18 |
19 | # The presence of this file turns this directory into a Python package
20 |
21 | '''
22 | This is the GNU Radio VLC module. Place your Python package
23 | description here (python/__init__.py).
24 | '''
25 |
26 | # import swig generated symbols into the vlc namespace
27 | try:
28 | # this might fail if the module is python-only
29 | from vlc_swig import *
30 | except ImportError:
31 | pass
32 |
33 | # import any pure python here
34 | #
35 |
--------------------------------------------------------------------------------
/lib/qa_vlc.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2012 Free Software Foundation, Inc.
4 | *
5 | * This file is part of GNU Radio
6 | *
7 | * GNU Radio is free software; you can redistribute it and/or modify
8 | * it under the terms of the GNU General Public License as published by
9 | * the Free Software Foundation; either version 3, or (at your option)
10 | * any later version.
11 | *
12 | * GNU Radio is distributed in the hope that it will be useful,
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 | * GNU General Public License for more details.
16 | *
17 | * You should have received a copy of the GNU General Public License
18 | * along with GNU Radio; see the file COPYING. If not, write to
19 | * the Free Software Foundation, Inc., 51 Franklin Street,
20 | * Boston, MA 02110-1301, USA.
21 | */
22 |
23 | #ifndef _QA_VLC_H_
24 | #define _QA_VLC_H_
25 |
26 | #include
27 | #include
28 |
29 | //! collect all the tests for the gr-filter directory
30 |
31 | class __GR_ATTR_EXPORT qa_vlc
32 | {
33 | public:
34 | //! return suite of tests for all of gr-filter directory
35 | static CppUnit::TestSuite *suite();
36 | };
37 |
38 | #endif /* _QA_VLC_H_ */
39 |
--------------------------------------------------------------------------------
/cmake/Modules/FindGnuradioRuntime.cmake:
--------------------------------------------------------------------------------
1 | INCLUDE(FindPkgConfig)
2 | PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime)
3 |
4 | if(PC_GNURADIO_RUNTIME_FOUND)
5 | # look for include files
6 | FIND_PATH(
7 | GNURADIO_RUNTIME_INCLUDE_DIRS
8 | NAMES gnuradio/top_block.h
9 | HINTS $ENV{GNURADIO_RUNTIME_DIR}/include
10 | ${PC_GNURADIO_RUNTIME_INCLUDE_DIRS}
11 | ${CMAKE_INSTALL_PREFIX}/include
12 | PATHS /usr/local/include
13 | /usr/include
14 | )
15 |
16 | # look for libs
17 | FIND_LIBRARY(
18 | GNURADIO_RUNTIME_LIBRARIES
19 | NAMES gnuradio-runtime
20 | HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib
21 | ${PC_GNURADIO_RUNTIME_LIBDIR}
22 | ${CMAKE_INSTALL_PREFIX}/lib/
23 | ${CMAKE_INSTALL_PREFIX}/lib64/
24 | PATHS /usr/local/lib
25 | /usr/local/lib64
26 | /usr/lib
27 | /usr/lib64
28 | )
29 |
30 | set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND})
31 | endif(PC_GNURADIO_RUNTIME_FOUND)
32 |
33 | INCLUDE(FindPackageHandleStandardArgs)
34 | # do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path us used.
35 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES)
36 | MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS)
37 |
--------------------------------------------------------------------------------
/cmake/cmake_uninstall.cmake.in:
--------------------------------------------------------------------------------
1 | # http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
2 |
3 | IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
4 | MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
5 | ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
6 |
7 | FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
8 | STRING(REGEX REPLACE "\n" ";" files "${files}")
9 | FOREACH(file ${files})
10 | MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
11 | IF(EXISTS "$ENV{DESTDIR}${file}")
12 | EXEC_PROGRAM(
13 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
14 | OUTPUT_VARIABLE rm_out
15 | RETURN_VALUE rm_retval
16 | )
17 | IF(NOT "${rm_retval}" STREQUAL 0)
18 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
19 | ENDIF(NOT "${rm_retval}" STREQUAL 0)
20 | ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}")
21 | EXEC_PROGRAM(
22 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
23 | OUTPUT_VARIABLE rm_out
24 | RETURN_VALUE rm_retval
25 | )
26 | IF(NOT "${rm_retval}" STREQUAL 0)
27 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
28 | ENDIF(NOT "${rm_retval}" STREQUAL 0)
29 | ELSE(EXISTS "$ENV{DESTDIR}${file}")
30 | MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
31 | ENDIF(EXISTS "$ENV{DESTDIR}${file}")
32 | ENDFOREACH(file)
33 |
--------------------------------------------------------------------------------
/docs/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Setup dependencies
22 | ########################################################################
23 | find_package(Doxygen)
24 |
25 | ########################################################################
26 | # Begin conditional configuration
27 | ########################################################################
28 | if(ENABLE_DOXYGEN)
29 |
30 | ########################################################################
31 | # Add subdirectories
32 | ########################################################################
33 | add_subdirectory(doxygen)
34 |
35 | endif(ENABLE_DOXYGEN)
36 |
--------------------------------------------------------------------------------
/lib/channel_fixed_impl.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifndef INCLUDED_VLC_CHANNEL_FIXED_IMPL_H
22 | #define INCLUDED_VLC_CHANNEL_FIXED_IMPL_H
23 |
24 | #include
25 |
26 | namespace gr {
27 | namespace vlc {
28 |
29 | class channel_fixed_impl : public channel_fixed
30 | {
31 | private:
32 | float gain;
33 | public:
34 | channel_fixed_impl(float gain);
35 | ~channel_fixed_impl();
36 |
37 | // Where all the action really happens
38 | int work(int noutput_items,
39 | gr_vector_const_void_star &input_items,
40 | gr_vector_void_star &output_items);
41 | };
42 |
43 | } // namespace vlc
44 | } // namespace gr
45 |
46 | #endif /* INCLUDED_VLC_CHANNEL_FIXED_IMPL_H */
47 |
48 |
--------------------------------------------------------------------------------
/lib/test_vlc.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2012 Free Software Foundation, Inc.
4 | *
5 | * This file is part of GNU Radio
6 | *
7 | * GNU Radio is free software; you can redistribute it and/or modify
8 | * it under the terms of the GNU General Public License as published by
9 | * the Free Software Foundation; either version 3, or (at your option)
10 | * any later version.
11 | *
12 | * GNU Radio is distributed in the hope that it will be useful,
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 | * GNU General Public License for more details.
16 | *
17 | * You should have received a copy of the GNU General Public License
18 | * along with GNU Radio; see the file COPYING. If not, write to
19 | * the Free Software Foundation, Inc., 51 Franklin Street,
20 | * Boston, MA 02110-1301, USA.
21 | */
22 |
23 | #ifdef HAVE_CONFIG_H
24 | #include "config.h"
25 | #endif
26 |
27 | #include
28 | #include
29 |
30 | #include
31 | #include "qa_vlc.h"
32 | #include
33 | #include
34 |
35 | int
36 | main (int argc, char **argv)
37 | {
38 | CppUnit::TextTestRunner runner;
39 | std::ofstream xmlfile(get_unittest_path("vlc.xml").c_str());
40 | CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile);
41 |
42 | runner.addTest(qa_vlc::suite());
43 | runner.setOutputter(xmlout);
44 |
45 | bool was_successful = runner.run("", false);
46 |
47 | return was_successful ? 0 : 1;
48 | }
49 |
--------------------------------------------------------------------------------
/python/build_utils_codes.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2004 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 |
22 | def i_code (code3):
23 | return code3[0]
24 |
25 | def o_code (code3):
26 | if len (code3) >= 2:
27 | return code3[1]
28 | else:
29 | return code3[0]
30 |
31 | def tap_code (code3):
32 | if len (code3) >= 3:
33 | return code3[2]
34 | else:
35 | return code3[0]
36 |
37 | def i_type (code3):
38 | return char_to_type[i_code (code3)]
39 |
40 | def o_type (code3):
41 | return char_to_type[o_code (code3)]
42 |
43 | def tap_type (code3):
44 | return char_to_type[tap_code (code3)]
45 |
46 |
47 | char_to_type = {}
48 | char_to_type['s'] = 'short'
49 | char_to_type['i'] = 'int'
50 | char_to_type['f'] = 'float'
51 | char_to_type['c'] = 'gr_complex'
52 | char_to_type['b'] = 'unsigned char'
53 |
--------------------------------------------------------------------------------
/lib/channel_static_impl.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifndef INCLUDED_VLC_CHANNEL_STATIC_IMPL_H
22 | #define INCLUDED_VLC_CHANNEL_STATIC_IMPL_H
23 |
24 | #include
25 |
26 | namespace gr {
27 | namespace vlc {
28 |
29 | class channel_static_impl : public channel_static
30 | {
31 | private:
32 | float gain;
33 |
34 | public:
35 | channel_static_impl(float emission_angle, float acceptance_angle, float distance);
36 | ~channel_static_impl();
37 |
38 | // Where all the action really happens
39 | int work(int noutput_items,
40 | gr_vector_const_void_star &input_items,
41 | gr_vector_void_star &output_items);
42 | };
43 |
44 | } // namespace vlc
45 | } // namespace gr
46 |
47 | #endif /* INCLUDED_VLC_CHANNEL_STATIC_IMPL_H */
48 |
49 |
--------------------------------------------------------------------------------
/grc/vlc_channel_relative.xml:
--------------------------------------------------------------------------------
1 |
2 | VLC Channel - Relative
3 | vlc_channel_relative
4 | [VLC]/Channel Model
5 | import vlc
6 | vlc.channel_relative($phi, $psi, $d, $m, $A, $n, $FOV, $Ts, $R)
7 | set_phi($phi)
8 | set_psi($psi)
9 | set_d($d)
10 | set_Ts($Ts)
11 |
12 |
13 | Emission Angle (deg)
14 | phi
15 | float
16 |
17 |
18 |
19 | Acceptance Angle (deg)
20 | psi
21 | float
22 |
23 |
24 |
25 | Distance (m)
26 | d
27 | float
28 |
29 |
30 |
31 | Lambertian Order
32 | m
33 | float
34 |
35 |
36 |
37 | Photodiode Area (m^2)
38 | A
39 | float
40 |
41 |
42 |
43 | Concentrator Index
44 | n
45 | float
46 |
47 |
48 |
49 | Receiver Field of View (deg)
50 | FOV
51 | float
52 |
53 |
54 |
55 | Filter Gain
56 | Ts
57 | float
58 |
59 |
60 |
61 | Photodiode Responsivity (A/W)
62 | R
63 | float
64 |
65 |
66 |
67 |
68 | in
69 | float
70 |
71 |
72 |
73 | out
74 | float
75 |
76 |
77 |
--------------------------------------------------------------------------------
/include/vlc/channel_fixed.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 |
22 | #ifndef INCLUDED_VLC_CHANNEL_FIXED_H
23 | #define INCLUDED_VLC_CHANNEL_FIXED_H
24 |
25 | #include
26 | #include
27 |
28 | namespace gr {
29 | namespace vlc {
30 |
31 | /*!
32 | * \brief <+description of block+>
33 | * \ingroup vlc
34 | *
35 | */
36 | class VLC_API channel_fixed : virtual public gr::sync_block
37 | {
38 | public:
39 | typedef boost::shared_ptr sptr;
40 |
41 | /*!
42 | * \brief Return a shared_ptr to a new instance of vlc::channel_fixed.
43 | *
44 | * To avoid accidental use of raw pointers, vlc::channel_fixed's
45 | * constructor is in a private implementation
46 | * class. vlc::channel_fixed::make is the public interface for
47 | * creating new instances.
48 | */
49 | static sptr make(float gain);
50 | };
51 |
52 | } // namespace vlc
53 | } // namespace gr
54 |
55 | #endif /* INCLUDED_VLC_CHANNEL_FIXED_H */
56 |
57 |
--------------------------------------------------------------------------------
/include/vlc/channel_static.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 |
22 | #ifndef INCLUDED_VLC_CHANNEL_STATIC_H
23 | #define INCLUDED_VLC_CHANNEL_STATIC_H
24 |
25 | #include
26 | #include
27 |
28 | namespace gr {
29 | namespace vlc {
30 |
31 | /*!
32 | * \brief <+description of block+>
33 | * \ingroup vlc
34 | *
35 | */
36 | class VLC_API channel_static : virtual public gr::sync_block
37 | {
38 | public:
39 | typedef boost::shared_ptr sptr;
40 |
41 | /*!
42 | * \brief Return a shared_ptr to a new instance of vlc::channel_static.
43 | *
44 | * To avoid accidental use of raw pointers, vlc::channel_static's
45 | * constructor is in a private implementation
46 | * class. vlc::channel_static::make is the public interface for
47 | * creating new instances.
48 | */
49 | static sptr make(float emission_angle, float acceptance_angle, float distance);
50 | };
51 |
52 | } // namespace vlc
53 | } // namespace gr
54 |
55 | #endif /* INCLUDED_VLC_CHANNEL_STATIC_H */
56 |
57 |
--------------------------------------------------------------------------------
/python/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Include python install macros
22 | ########################################################################
23 | include(GrPython)
24 | if(NOT PYTHONINTERP_FOUND)
25 | return()
26 | endif()
27 |
28 | ########################################################################
29 | # Install python sources
30 | ########################################################################
31 | GR_PYTHON_INSTALL(
32 | FILES
33 | __init__.py
34 | DESTINATION ${GR_PYTHON_DIR}/vlc
35 | )
36 |
37 | ########################################################################
38 | # Handle the unit tests
39 | ########################################################################
40 | include(GrTest)
41 |
42 | set(GR_TEST_TARGET_DEPS gnuradio-vlc)
43 | set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
44 | GR_ADD_TEST(qa_channel_fixed ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_channel_fixed.py)
45 | GR_ADD_TEST(qa_channel_static ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_channel_static.py)
46 | GR_ADD_TEST(qa_channel_relative ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_channel_relative.py)
47 |
48 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/text.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Utilities for extracting text from generated classes.
23 | """
24 |
25 | def is_string(txt):
26 | if isinstance(txt, str):
27 | return True
28 | try:
29 | if isinstance(txt, unicode):
30 | return True
31 | except NameError:
32 | pass
33 | return False
34 |
35 | def description(obj):
36 | if obj is None:
37 | return None
38 | return description_bit(obj).strip()
39 |
40 | def description_bit(obj):
41 | if hasattr(obj, 'content'):
42 | contents = [description_bit(item) for item in obj.content]
43 | result = ''.join(contents)
44 | elif hasattr(obj, 'content_'):
45 | contents = [description_bit(item) for item in obj.content_]
46 | result = ''.join(contents)
47 | elif hasattr(obj, 'value'):
48 | result = description_bit(obj.value)
49 | elif is_string(obj):
50 | return obj
51 | else:
52 | raise StandardError('Expecting a string or something with content, content_ or value attribute')
53 | # If this bit is a paragraph then add one some line breaks.
54 | if hasattr(obj, 'name') and obj.name == 'para':
55 | result += "\n\n"
56 | return result
57 |
--------------------------------------------------------------------------------
/cmake/Modules/GrPlatform.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Setup additional defines for OS types
27 | ########################################################################
28 | if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
29 | set(LINUX TRUE)
30 | endif()
31 |
32 | if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/debian_version")
33 | set(DEBIAN TRUE)
34 | endif()
35 |
36 | if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/redhat-release")
37 | set(REDHAT TRUE)
38 | endif()
39 |
40 | if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/slackware-version")
41 | set(SLACKWARE TRUE)
42 | endif()
43 |
44 | ########################################################################
45 | # when the library suffix should be 64 (applies to redhat linux family)
46 | ########################################################################
47 | if (REDHAT OR SLACKWARE)
48 | set(LIB64_CONVENTION TRUE)
49 | endif()
50 |
51 | if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
52 | set(LIB_SUFFIX 64)
53 | endif()
54 | set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
55 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/generated/index.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """
4 | Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
5 | """
6 |
7 | from xml.dom import minidom
8 |
9 | import os
10 | import sys
11 | import compound
12 |
13 | import indexsuper as supermod
14 |
15 | class DoxygenTypeSub(supermod.DoxygenType):
16 | def __init__(self, version=None, compound=None):
17 | supermod.DoxygenType.__init__(self, version, compound)
18 |
19 | def find_compounds_and_members(self, details):
20 | """
21 | Returns a list of all compounds and their members which match details
22 | """
23 |
24 | results = []
25 | for compound in self.compound:
26 | members = compound.find_members(details)
27 | if members:
28 | results.append([compound, members])
29 | else:
30 | if details.match(compound):
31 | results.append([compound, []])
32 |
33 | return results
34 |
35 | supermod.DoxygenType.subclass = DoxygenTypeSub
36 | # end class DoxygenTypeSub
37 |
38 |
39 | class CompoundTypeSub(supermod.CompoundType):
40 | def __init__(self, kind=None, refid=None, name='', member=None):
41 | supermod.CompoundType.__init__(self, kind, refid, name, member)
42 |
43 | def find_members(self, details):
44 | """
45 | Returns a list of all members which match details
46 | """
47 |
48 | results = []
49 |
50 | for member in self.member:
51 | if details.match(member):
52 | results.append(member)
53 |
54 | return results
55 |
56 | supermod.CompoundType.subclass = CompoundTypeSub
57 | # end class CompoundTypeSub
58 |
59 |
60 | class MemberTypeSub(supermod.MemberType):
61 |
62 | def __init__(self, kind=None, refid=None, name=''):
63 | supermod.MemberType.__init__(self, kind, refid, name)
64 |
65 | supermod.MemberType.subclass = MemberTypeSub
66 | # end class MemberTypeSub
67 |
68 |
69 | def parse(inFilename):
70 |
71 | doc = minidom.parse(inFilename)
72 | rootNode = doc.documentElement
73 | rootObj = supermod.DoxygenType.factory()
74 | rootObj.build(rootNode)
75 |
76 | return rootObj
77 |
78 |
--------------------------------------------------------------------------------
/docs/doxygen/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Create the doxygen configuration file
22 | ########################################################################
23 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
24 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
25 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir)
26 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
27 |
28 | set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
29 | set(enable_html_docs YES)
30 | set(enable_latex_docs NO)
31 | set(enable_xml_docs YES)
32 |
33 | configure_file(
34 | ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
35 | ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
36 | @ONLY)
37 |
38 | set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html)
39 |
40 | ########################################################################
41 | # Make and install doxygen docs
42 | ########################################################################
43 | add_custom_command(
44 | OUTPUT ${BUILT_DIRS}
45 | COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
46 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
47 | COMMENT "Generating documentation with doxygen"
48 | )
49 |
50 | add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS})
51 |
52 | install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR})
53 |
--------------------------------------------------------------------------------
/lib/channel_relative_impl.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifndef INCLUDED_VLC_CHANNEL_RELATIVE_IMPL_H
22 | #define INCLUDED_VLC_CHANNEL_RELATIVE_IMPL_H
23 |
24 | #include
25 |
26 | namespace gr {
27 | namespace vlc {
28 |
29 | class channel_relative_impl : public channel_relative
30 | {
31 | private:
32 | float d_phi, d_psi, d_d;
33 | float d_m;
34 | float d_A, d_n, d_FOV, d_Ts;
35 | float d_R;
36 | float d_gain;
37 |
38 |
39 | public:
40 | channel_relative_impl(float phi, float psi, float d, float m, float A, float n, float FOV, float Ts, float R);
41 | ~channel_relative_impl();
42 |
43 | void set_phi(float phi) { d_phi = phi; update_gain(); }
44 | float phi() { return d_phi; }
45 | void set_psi(float psi) { d_psi = psi; update_gain(); }
46 | float psi() { return d_psi; }
47 | void set_d(float d) { d_d = d; update_gain(); }
48 | float d() { return d_d; }
49 | void set_Ts(float Ts) {d_Ts = Ts; update_gain(); }
50 | float Ts() {return d_Ts; }
51 | float update_gain();
52 |
53 |
54 | // Where all the action really happens
55 | int work(int noutput_items,
56 | gr_vector_const_void_star &input_items,
57 | gr_vector_void_star &output_items);
58 | };
59 |
60 | } // namespace vlc
61 | } // namespace gr
62 |
63 | #endif /* INCLUDED_VLC_CHANNEL_RELATIVE_IMPL_H */
64 |
65 |
--------------------------------------------------------------------------------
/lib/channel_fixed_impl.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifdef HAVE_CONFIG_H
22 | #include "config.h"
23 | #endif
24 |
25 | #include
26 | #include "channel_fixed_impl.h"
27 |
28 | namespace gr {
29 | namespace vlc {
30 |
31 | channel_fixed::sptr
32 | channel_fixed::make(float gain)
33 | {
34 | return gnuradio::get_initial_sptr
35 | (new channel_fixed_impl(gain));
36 | }
37 |
38 | /*
39 | * The private constructor
40 | */
41 | channel_fixed_impl::channel_fixed_impl(float gain)
42 | : gr::sync_block("channel_fixed",
43 | gr::io_signature::make(1, 1, sizeof(float)),
44 | gr::io_signature::make(1, 1, sizeof(float)))
45 | {
46 | channel_fixed_impl::gain = gain;
47 | }
48 |
49 | /*
50 | * Our virtual destructor.
51 | */
52 | channel_fixed_impl::~channel_fixed_impl()
53 | {
54 | }
55 |
56 | int
57 | channel_fixed_impl::work(int noutput_items,
58 | gr_vector_const_void_star &input_items,
59 | gr_vector_void_star &output_items)
60 | {
61 | const float *in = (const float *) input_items[0];
62 | float *out = (float *) output_items[0];
63 |
64 | for(int i = 0; i < noutput_items; i++) {
65 | out[i] = in[i] * channel_fixed_impl::gain;
66 | }
67 |
68 | // Tell runtime system how many output items we produced.
69 | return noutput_items;
70 | }
71 |
72 | } /* namespace vlc */
73 | } /* namespace gr */
74 |
75 |
--------------------------------------------------------------------------------
/include/vlc/channel_relative.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 |
22 | #ifndef INCLUDED_VLC_CHANNEL_RELATIVE_H
23 | #define INCLUDED_VLC_CHANNEL_RELATIVE_H
24 |
25 | #include
26 | #include
27 |
28 | namespace gr {
29 | namespace vlc {
30 |
31 | /*!
32 | * \brief VLC channel model with variable distance and emission / acceptance angle.
33 | * \ingroup vlc
34 | *
35 | */
36 | class VLC_API channel_relative : virtual public gr::sync_block
37 | {
38 | public:
39 | typedef boost::shared_ptr sptr;
40 |
41 | /*!
42 | * \brief Return a shared_ptr to a new instance of vlc::channel_relative.
43 | *
44 | * To avoid accidental use of raw pointers, vlc::channel_relative's
45 | * constructor is in a private implementation
46 | * class. vlc::channel_relative::make is the public interface for
47 | * creating new instances.
48 | */
49 | static sptr make(float phi, float psi, float d, float m, float A, float n, float FOV, float Ts, float R);
50 |
51 | virtual void set_phi(float phi) = 0;
52 | virtual float phi() = 0;
53 | virtual void set_psi(float psi) = 0;
54 | virtual float psi() = 0;
55 | virtual void set_d(float d) = 0;
56 | virtual float d() = 0;
57 | virtual void set_Ts(float Ts) = 0;
58 | virtual float Ts() = 0;
59 | };
60 |
61 | } // namespace vlc
62 | } // namespace gr
63 |
64 | #endif /* INCLUDED_VLC_CHANNEL_RELATIVE_H */
65 |
66 |
--------------------------------------------------------------------------------
/swig/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Check if there is C++ code at all
22 | ########################################################################
23 | if(NOT vlc_sources)
24 | MESSAGE(STATUS "No C++ sources... skipping swig/")
25 | return()
26 | endif(NOT vlc_sources)
27 |
28 | ########################################################################
29 | # Include swig generation macros
30 | ########################################################################
31 | find_package(SWIG)
32 | find_package(PythonLibs 2)
33 | if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
34 | return()
35 | endif()
36 | include(GrSwig)
37 | include(GrPython)
38 |
39 | ########################################################################
40 | # Setup swig generation
41 | ########################################################################
42 | foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS})
43 | list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig)
44 | endforeach(incdir)
45 |
46 | set(GR_SWIG_LIBRARIES gnuradio-vlc)
47 | set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/vlc_swig_doc.i)
48 | set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
49 |
50 | GR_SWIG_MAKE(vlc_swig vlc_swig.i)
51 |
52 | ########################################################################
53 | # Install the build swig module
54 | ########################################################################
55 | GR_SWIG_INSTALL(TARGETS vlc_swig DESTINATION ${GR_PYTHON_DIR}/vlc)
56 |
57 | ########################################################################
58 | # Install swig .i files for development
59 | ########################################################################
60 | install(
61 | FILES
62 | vlc_swig.i
63 | ${CMAKE_CURRENT_BINARY_DIR}/vlc_swig_doc.i
64 | DESTINATION ${GR_INCLUDE_DIR}/vlc/swig
65 | )
66 |
--------------------------------------------------------------------------------
/lib/channel_static_impl.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifdef HAVE_CONFIG_H
22 | #include "config.h"
23 | #endif
24 |
25 | #include
26 | #include
27 | #include "channel_static_impl.h"
28 |
29 | namespace gr {
30 | namespace vlc {
31 |
32 | channel_static::sptr
33 | channel_static::make(float emission_angle, float acceptance_angle, float distance)
34 | {
35 | return gnuradio::get_initial_sptr
36 | (new channel_static_impl(emission_angle, acceptance_angle, distance));
37 | }
38 |
39 | /*
40 | * The private constructor
41 | */
42 | channel_static_impl::channel_static_impl(float emission_angle, float acceptance_angle, float distance)
43 | : gr::sync_block("channel_static",
44 | gr::io_signature::make(1, 1, sizeof(float)),
45 | gr::io_signature::make(1, 1, sizeof(float)))
46 | {
47 | double m = 1;
48 | float A = 1;
49 | //int n = 1;
50 | //int FOV = 60;
51 | float G_tx, G_rx;
52 |
53 | G_tx = ((m+1)/(2*M_PI))*pow(cos(double(emission_angle*M_PI/180)),m);
54 | G_rx = A*cos((double)acceptance_angle*M_PI/180);
55 |
56 | channel_static_impl::gain = G_tx*G_rx/(distance*distance);
57 | }
58 |
59 | /*
60 | * Our virtual destructor.
61 | */
62 | channel_static_impl::~channel_static_impl()
63 | {
64 | }
65 |
66 | int
67 | channel_static_impl::work(int noutput_items,
68 | gr_vector_const_void_star &input_items,
69 | gr_vector_void_star &output_items)
70 | {
71 | const float *in = (const float *) input_items[0];
72 | float *out = (float *) output_items[0];
73 |
74 | for(int i = 0; i < noutput_items; i++) {
75 | out[i] = in[i] * channel_static_impl::gain;
76 | }
77 |
78 | // Tell runtime system how many output items we produced.
79 | return noutput_items;
80 | }
81 |
82 | } /* namespace vlc */
83 | } /* namespace gr */
84 |
85 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/__init__.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Python interface to contents of doxygen xml documentation.
23 |
24 | Example use:
25 | See the contents of the example folder for the C++ and
26 | doxygen-generated xml used in this example.
27 |
28 | >>> # Parse the doxygen docs.
29 | >>> import os
30 | >>> this_dir = os.path.dirname(globals()['__file__'])
31 | >>> xml_path = this_dir + "/example/xml/"
32 | >>> di = DoxyIndex(xml_path)
33 |
34 | Get a list of all top-level objects.
35 |
36 | >>> print([mem.name() for mem in di.members()])
37 | [u'Aadvark', u'aadvarky_enough', u'main']
38 |
39 | Get all functions.
40 |
41 | >>> print([mem.name() for mem in di.in_category(DoxyFunction)])
42 | [u'aadvarky_enough', u'main']
43 |
44 | Check if an object is present.
45 |
46 | >>> di.has_member(u'Aadvark')
47 | True
48 | >>> di.has_member(u'Fish')
49 | False
50 |
51 | Get an item by name and check its properties.
52 |
53 | >>> aad = di.get_member(u'Aadvark')
54 | >>> print(aad.brief_description)
55 | Models the mammal Aadvark.
56 | >>> print(aad.detailed_description)
57 | Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
58 |
59 | This line is uninformative and is only to test line breaks in the comments.
60 | >>> [mem.name() for mem in aad.members()]
61 | [u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness']
62 | >>> aad.get_member(u'print').brief_description
63 | u'Outputs the vital aadvark statistics.'
64 |
65 | """
66 |
67 | from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
68 |
69 | def _test():
70 | import os
71 | this_dir = os.path.dirname(globals()['__file__'])
72 | xml_path = this_dir + "/example/xml/"
73 | di = DoxyIndex(xml_path)
74 | # Get the Aadvark class
75 | aad = di.get_member('Aadvark')
76 | aad.brief_description
77 | import doctest
78 | return doctest.testmod()
79 |
80 | if __name__ == "__main__":
81 | _test()
82 |
83 |
--------------------------------------------------------------------------------
/python/qa_channel_fixed.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | #
4 | # Copyright 2016 <+YOU OR YOUR COMPANY+>.
5 | #
6 | # This is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # This software is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with this software; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 |
22 | from gnuradio import gr, gr_unittest
23 | from gnuradio import blocks
24 | import vlc_swig as vlc
25 |
26 | class qa_channel_fixed (gr_unittest.TestCase):
27 |
28 | def setUp (self):
29 | self.tb = gr.top_block ()
30 |
31 | def tearDown (self):
32 | self.tb = None
33 |
34 | def test_001_t (self):
35 | my_gain = 2;
36 | src_data = (-3, 4, -5.5, 2.2, 3)
37 | expected_result = (-6, 8, -11, 4.4, 6)
38 | src = blocks.vector_source_f(src_data)
39 | my_chan = vlc.channel_fixed(my_gain)
40 | dst = blocks.vector_sink_f()
41 | self.tb.connect(src, my_chan)
42 | self.tb.connect(my_chan, dst)
43 | self.tb.run()
44 | result_data = dst.data()
45 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
46 |
47 | def test_002_t (self):
48 | my_gain = 1;
49 | src_data = (-3, 4, -5.5, 2.2, 3)
50 | expected_result = (-3, 4, -5.5, 2.2, 3)
51 | src = blocks.vector_source_f(src_data)
52 | my_chan = vlc.channel_fixed(my_gain)
53 | dst = blocks.vector_sink_f()
54 | self.tb.connect(src, my_chan)
55 | self.tb.connect(my_chan, dst)
56 | self.tb.run()
57 | result_data = dst.data()
58 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
59 |
60 | def test_003_t (self):
61 | my_gain = 0.22;
62 | src_data = (1, 2, 3, 4, 5, -1, 0, -2, 0.1)
63 | expected_result = (0.22, 0.44, 0.66, 0.88, 1.10, -0.22, 0, -0.44, 0.022)
64 | src = blocks.vector_source_f(src_data)
65 | my_chan = vlc.channel_fixed(my_gain)
66 | dst = blocks.vector_sink_f()
67 | self.tb.connect(src, my_chan)
68 | self.tb.connect(my_chan, dst)
69 | self.tb.run()
70 | result_data = dst.data()
71 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
72 |
73 | if __name__ == '__main__':
74 | gr_unittest.run(qa_channel_fixed, "qa_channel_fixed.xml")
75 |
--------------------------------------------------------------------------------
/lib/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011,2012 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Setup library
22 | ########################################################################
23 | include(GrPlatform) #define LIB_SUFFIX
24 |
25 | include_directories(${Boost_INCLUDE_DIR})
26 | link_directories(${Boost_LIBRARY_DIRS})
27 |
28 | list(APPEND vlc_sources
29 | channel_fixed_impl.cc
30 | channel_static_impl.cc
31 | channel_relative_impl.cc
32 |
33 | )
34 |
35 | set(vlc_sources "${vlc_sources}" PARENT_SCOPE)
36 | if(NOT vlc_sources)
37 | MESSAGE(STATUS "No C++ sources... skipping lib/")
38 | return()
39 | endif(NOT vlc_sources)
40 |
41 | add_library(gnuradio-vlc SHARED ${vlc_sources})
42 | target_link_libraries(gnuradio-vlc ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES})
43 | set_target_properties(gnuradio-vlc PROPERTIES DEFINE_SYMBOL "gnuradio_vlc_EXPORTS")
44 |
45 | if(APPLE)
46 | set_target_properties(gnuradio-vlc PROPERTIES
47 | INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
48 | )
49 | endif(APPLE)
50 |
51 | ########################################################################
52 | # Install built library files
53 | ########################################################################
54 | install(TARGETS gnuradio-vlc
55 | LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file
56 | ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
57 | RUNTIME DESTINATION bin # .dll file
58 | )
59 |
60 | ########################################################################
61 | # Build and register unit test
62 | ########################################################################
63 | include(GrTest)
64 |
65 | include_directories(${CPPUNIT_INCLUDE_DIRS})
66 |
67 | list(APPEND test_vlc_sources
68 | ${CMAKE_CURRENT_SOURCE_DIR}/test_vlc.cc
69 | ${CMAKE_CURRENT_SOURCE_DIR}/qa_vlc.cc
70 | )
71 |
72 | add_executable(test-vlc ${test_vlc_sources})
73 |
74 | target_link_libraries(
75 | test-vlc
76 | ${GNURADIO_RUNTIME_LIBRARIES}
77 | ${Boost_LIBRARIES}
78 | ${CPPUNIT_LIBRARIES}
79 | gnuradio-vlc
80 | )
81 |
82 | GR_ADD_TEST(test_vlc test-vlc)
83 |
--------------------------------------------------------------------------------
/python/qa_channel_static.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | #
4 | # Copyright 2016 <+YOU OR YOUR COMPANY+>.
5 | #
6 | # This is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # This software is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with this software; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 |
22 | from gnuradio import gr, gr_unittest
23 | from gnuradio import blocks
24 | import vlc_swig as vlc
25 | import math
26 |
27 | class qa_channel_static (gr_unittest.TestCase):
28 |
29 | def setUp (self):
30 | self.tb = gr.top_block ()
31 |
32 | def tearDown (self):
33 | self.tb = None
34 |
35 | def test_001_t (self):
36 | my_phi = 0;
37 | my_psi = 0;
38 | my_dist = 1;
39 | pi = math.pi;
40 |
41 | src_data = (1, 2, 3, 4, 5, 2.5, 5.234, 9.999)
42 | expected_result = (1/pi, 2/pi, 3/pi, 4/pi, 5/pi, 2.5/pi, 5.234/pi, 9.999/pi)
43 | src = blocks.vector_source_f(src_data)
44 | my_chan = vlc.channel_static(my_phi, my_psi, my_dist)
45 | dst = blocks.vector_sink_f()
46 | self.tb.connect(src, my_chan)
47 | self.tb.connect(my_chan, dst)
48 | self.tb.run()
49 | result_data = dst.data()
50 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
51 |
52 | def test_002_t (self):
53 | my_phi = 0
54 | my_psi = 15
55 | my_dist = 1
56 |
57 | g_tx = 1/math.pi
58 | g_rx = 0.96592582628
59 | G = g_tx*g_rx/(my_dist*my_dist)
60 |
61 | src_data = (1, 2, 3, 4, 5, 2.5, 5.234, 9.999)
62 | expected_result = (1*G, 2*G, 3*G, 4*G, 5*G, 2.5*G, 5.234*G, 9.999*G)
63 | src = blocks.vector_source_f(src_data)
64 | my_chan = vlc.channel_static(my_phi, my_psi, my_dist)
65 | dst = blocks.vector_sink_f()
66 | self.tb.connect(src, my_chan)
67 | self.tb.connect(my_chan, dst)
68 | self.tb.run()
69 | result_data = dst.data()
70 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
71 |
72 | def test_003_t (self):
73 | my_phi = 30
74 | my_psi = 15
75 | my_dist = 1
76 |
77 | g_tx = 0.86602540378/math.pi
78 | g_rx = 0.96592582628
79 | G = g_tx*g_rx/(my_dist*my_dist)
80 |
81 | src_data = (1, 2, 3, 4, 5, 2.5, 5.234, 9.999)
82 | expected_result = (1*G, 2*G, 3*G, 4*G, 5*G, 2.5*G, 5.234*G, 9.999*G)
83 | src = blocks.vector_source_f(src_data)
84 | my_chan = vlc.channel_static(my_phi, my_psi, my_dist)
85 | dst = blocks.vector_sink_f()
86 | self.tb.connect(src, my_chan)
87 | self.tb.connect(my_chan, dst)
88 | self.tb.run()
89 | result_data = dst.data()
90 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
91 |
92 | if __name__ == '__main__':
93 | gr_unittest.run(qa_channel_static, "qa_channel_static.xml")
94 |
--------------------------------------------------------------------------------
/python/qa_channel_relative.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | #
4 | # Copyright 2016 <+YOU OR YOUR COMPANY+>.
5 | #
6 | # This is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # This software is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with this software; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 |
22 | from gnuradio import gr, gr_unittest
23 | from gnuradio import blocks
24 | import vlc_swig as vlc
25 |
26 | class qa_channel_relative (gr_unittest.TestCase):
27 |
28 | def setUp (self):
29 | self.tb = gr.top_block ()
30 |
31 | def tearDown (self):
32 | self.tb = None
33 |
34 | def test_001_t (self):
35 | phi = 90;
36 | psi = 90;
37 | d = 1;
38 | m = 1;
39 | A = 1;
40 | n = 1;
41 | FOV = 90;
42 | Ts = 1;
43 | R = 1;
44 | src_data = (1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0)
45 | expected_result = (0,0,0,0,0,0,0,0,0,0)
46 |
47 | src = blocks.vector_source_f(src_data)
48 | blk = vlc.channel_relative(phi, psi, d, m, A, n, FOV, Ts, R)
49 | dst = blocks.vector_sink_f()
50 |
51 | self.tb.connect(src, blk)
52 | self.tb.connect(blk, dst)
53 | self.tb.run()
54 | result_data = dst.data()
55 |
56 | print "Source: "
57 | print str(src_data).strip('[]')
58 | print "Results: "
59 | print str(result_data).strip('[]')
60 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
61 |
62 | def test_002_t (self):
63 | phi = 10;
64 | psi = 20;
65 | d = 1;
66 | m = 1;
67 | A = 1;
68 | n = 1;
69 | FOV = 90;
70 | Ts = 1;
71 | R = 1;
72 | src_data = (1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0)
73 | expected_result = (0,0,0,0,0,0,0,0,0,0)
74 |
75 | src = blocks.vector_source_f(src_data)
76 | blk = vlc.channel_relative(phi, psi, d, m, A, n, FOV, Ts, R)
77 | dst = blocks.vector_sink_f()
78 |
79 | blk.set_phi(45)
80 | blk.set_psi(90)
81 | blk.set_d(5)
82 |
83 | print "Emission Angle: %f." % blk.phi()
84 | print "Acceptance Angle: %f." % blk.psi()
85 | print "Distance: %f." % blk.d()
86 |
87 | self.tb.connect(src, blk)
88 | self.tb.connect(blk, dst)
89 | self.tb.run()
90 | result_data = dst.data()
91 | blk.set_Ts(2)
92 | print "Filter Gain: %f." % blk.Ts()
93 |
94 | print "Source: "
95 | print str(src_data).strip('[]')
96 | print "Results: "
97 | print str(result_data).strip('[]')
98 | self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
99 |
100 | if __name__ == '__main__':
101 | gr_unittest.run(qa_channel_relative, "qa_channel_relative.xml")
102 |
--------------------------------------------------------------------------------
/lib/channel_relative_impl.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2016 <+YOU OR YOUR COMPANY+>.
4 | *
5 | * This is free software; you can redistribute it and/or modify
6 | * it under the terms of the GNU General Public License as published by
7 | * the Free Software Foundation; either version 3, or (at your option)
8 | * any later version.
9 | *
10 | * This software is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this software; see the file COPYING. If not, write to
17 | * the Free Software Foundation, Inc., 51 Franklin Street,
18 | * Boston, MA 02110-1301, USA.
19 | */
20 |
21 | #ifdef HAVE_CONFIG_H
22 | #include "config.h"
23 | #endif
24 |
25 | #include
26 | #include "channel_relative_impl.h"
27 | #include
28 |
29 | namespace gr {
30 | namespace vlc {
31 |
32 | channel_relative::sptr
33 | channel_relative::make(float phi, float psi, float d, float m, float A, float n, float FOV, float Ts, float R)
34 | {
35 | return gnuradio::get_initial_sptr
36 | (new channel_relative_impl(phi, psi, d, m, A, n, FOV, Ts, R));
37 | }
38 |
39 | /*
40 | * The private constructor
41 | */
42 | channel_relative_impl::channel_relative_impl(float phi, float psi, float d, float m, float A, float n, float FOV, float Ts, float R)
43 | : gr::sync_block("channel_relative",
44 | gr::io_signature::make(1, 1, sizeof(float)),
45 | gr::io_signature::make(1, 1, sizeof(float)))
46 | {
47 | d_phi = phi;
48 | d_psi = psi;
49 | d_d = d;
50 | d_m = m;
51 | d_A = A;
52 | d_n = n;
53 | d_FOV = FOV;
54 | d_Ts = Ts;
55 | d_R = R;
56 |
57 | update_gain();
58 | }
59 |
60 | /*
61 | * Our virtual destructor.
62 | */
63 | channel_relative_impl::~channel_relative_impl()
64 | {
65 | }
66 |
67 | float channel_relative_impl::update_gain()
68 | {
69 | float Ho, G_tx, G_rx, gc;
70 | float phi_rad, psi_rad, FOV_rad;
71 |
72 | phi_rad = d_phi*(M_PI/180);
73 | psi_rad = d_psi*(M_PI/180);
74 | FOV_rad = d_FOV*(M_PI/180);
75 |
76 | // Transmitter gain
77 | G_tx = ((d_m+1)/(2*M_PI))*pow(cos(phi_rad), d_m);
78 |
79 | // Concentrator Gain
80 | if (d_psi <= d_FOV)
81 | gc = (d_n*d_n)/pow(sin(FOV_rad), 2);
82 | else
83 | gc = 0;
84 |
85 | // Receiver gain
86 | G_rx = d_A * d_Ts * gc * cos(psi_rad);
87 |
88 | // Calculate optical channel gain
89 | Ho = G_tx * G_rx / (d_d*d_d);
90 |
91 | // Set gain [A/W] (Note: d_gain = optical gain if d_R=1)
92 | d_gain = d_R*Ho;
93 | }
94 |
95 | int
96 | channel_relative_impl::work(int noutput_items,
97 | gr_vector_const_void_star &input_items,
98 | gr_vector_void_star &output_items)
99 | {
100 | const float *in = (const float *) input_items[0];
101 | float *out = (float *) output_items[0];
102 |
103 | for (int i = 0; i < noutput_items; i++) {
104 | out[i] = in[i]*d_gain;
105 | }
106 |
107 | // Tell runtime system how many output items we produced.
108 | return noutput_items;
109 | }
110 |
111 | } /* namespace vlc */
112 | } /* namespace gr */
113 |
114 |
--------------------------------------------------------------------------------
/cmake/Modules/GrTest.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_TEST_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_TEST_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Add a unit test and setup the environment for a unit test.
27 | # Takes the same arguments as the ADD_TEST function.
28 | #
29 | # Before calling set the following variables:
30 | # GR_TEST_TARGET_DEPS - built targets for the library path
31 | # GR_TEST_LIBRARY_DIRS - directories for the library path
32 | # GR_TEST_PYTHON_DIRS - directories for the python path
33 | # GR_TEST_ENVIRONS - other environment key/value pairs
34 | ########################################################################
35 | function(GR_ADD_TEST test_name)
36 |
37 | #Ensure that the build exe also appears in the PATH.
38 | list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
39 |
40 | #In the land of windows, all libraries must be in the PATH.
41 | #Since the dependent libraries are not yet installed,
42 | #we must manually set them in the PATH to run tests.
43 | #The following appends the path of a target dependency.
44 | foreach(target ${GR_TEST_TARGET_DEPS})
45 | get_target_property(location ${target} LOCATION)
46 | if(location)
47 | get_filename_component(path ${location} PATH)
48 | string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
49 | list(APPEND GR_TEST_LIBRARY_DIRS ${path})
50 | endif(location)
51 | endforeach(target)
52 |
53 | if(WIN32)
54 | #SWIG generates the python library files into a subdirectory.
55 | #Therefore, we must append this subdirectory into PYTHONPATH.
56 | #Only do this for the python directories matching the following:
57 | foreach(pydir ${GR_TEST_PYTHON_DIRS})
58 | get_filename_component(name ${pydir} NAME)
59 | if(name MATCHES "^(swig|lib|src)$")
60 | list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
61 | endif()
62 | endforeach(pydir)
63 | endif(WIN32)
64 |
65 | file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
66 | file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
67 | file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
68 |
69 | set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
70 | list(APPEND environs ${GR_TEST_ENVIRONS})
71 |
72 | #http://www.cmake.org/pipermail/cmake/2009-May/029464.html
73 | #Replaced this add test + set environs code with the shell script generation.
74 | #Its nicer to be able to manually run the shell script to diagnose problems.
75 | #ADD_TEST(${ARGV})
76 | #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
77 |
78 | if(UNIX)
79 | set(LD_PATH_VAR "LD_LIBRARY_PATH")
80 | if(APPLE)
81 | set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
82 | endif()
83 |
84 | set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
85 | list(APPEND libpath "$${LD_PATH_VAR}")
86 | list(APPEND pypath "$PYTHONPATH")
87 |
88 | #replace list separator with the path separator
89 | string(REPLACE ";" ":" libpath "${libpath}")
90 | string(REPLACE ";" ":" pypath "${pypath}")
91 | list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
92 |
93 | #generate a bat file that sets the environment and runs the test
94 | if (CMAKE_CROSSCOMPILING)
95 | set(SHELL "/bin/sh")
96 | else(CMAKE_CROSSCOMPILING)
97 | find_program(SHELL sh)
98 | endif(CMAKE_CROSSCOMPILING)
99 | set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
100 | file(WRITE ${sh_file} "#!${SHELL}\n")
101 | #each line sets an environment variable
102 | foreach(environ ${environs})
103 | file(APPEND ${sh_file} "export ${environ}\n")
104 | endforeach(environ)
105 | #load the command to run with its arguments
106 | foreach(arg ${ARGN})
107 | file(APPEND ${sh_file} "${arg} ")
108 | endforeach(arg)
109 | file(APPEND ${sh_file} "\n")
110 |
111 | #make the shell file executable
112 | execute_process(COMMAND chmod +x ${sh_file})
113 |
114 | add_test(${test_name} ${SHELL} ${sh_file})
115 |
116 | endif(UNIX)
117 |
118 | if(WIN32)
119 | list(APPEND libpath ${DLL_PATHS} "%PATH%")
120 | list(APPEND pypath "%PYTHONPATH%")
121 |
122 | #replace list separator with the path separator (escaped)
123 | string(REPLACE ";" "\\;" libpath "${libpath}")
124 | string(REPLACE ";" "\\;" pypath "${pypath}")
125 | list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
126 |
127 | #generate a bat file that sets the environment and runs the test
128 | set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
129 | file(WRITE ${bat_file} "@echo off\n")
130 | #each line sets an environment variable
131 | foreach(environ ${environs})
132 | file(APPEND ${bat_file} "SET ${environ}\n")
133 | endforeach(environ)
134 | #load the command to run with its arguments
135 | foreach(arg ${ARGN})
136 | file(APPEND ${bat_file} "${arg} ")
137 | endforeach(arg)
138 | file(APPEND ${bat_file} "\n")
139 |
140 | add_test(${test_name} ${bat_file})
141 | endif(WIN32)
142 |
143 | endfunction(GR_ADD_TEST)
144 |
--------------------------------------------------------------------------------
/cmake/Modules/CMakeParseArgumentsCopy.cmake:
--------------------------------------------------------------------------------
1 | # CMAKE_PARSE_ARGUMENTS( args...)
2 | #
3 | # CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions for
4 | # parsing the arguments given to that macro or function.
5 | # It processes the arguments and defines a set of variables which hold the
6 | # values of the respective options.
7 | #
8 | # The argument contains all options for the respective macro,
9 | # i.e. keywords which can be used when calling the macro without any value
10 | # following, like e.g. the OPTIONAL keyword of the install() command.
11 | #
12 | # The argument contains all keywords for this macro
13 | # which are followed by one value, like e.g. DESTINATION keyword of the
14 | # install() command.
15 | #
16 | # The argument contains all keywords for this macro
17 | # which can be followed by more than one value, like e.g. the TARGETS or
18 | # FILES keywords of the install() command.
19 | #
20 | # When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
21 | # keywords listed in , and
22 | # a variable composed of the given
23 | # followed by "_" and the name of the respective keyword.
24 | # These variables will then hold the respective value from the argument list.
25 | # For the keywords this will be TRUE or FALSE.
26 | #
27 | # All remaining arguments are collected in a variable
28 | # _UNPARSED_ARGUMENTS, this can be checked afterwards to see whether
29 | # your macro was called with unrecognized parameters.
30 | #
31 | # As an example here a my_install() macro, which takes similar arguments as the
32 | # real install() command:
33 | #
34 | # function(MY_INSTALL)
35 | # set(options OPTIONAL FAST)
36 | # set(oneValueArgs DESTINATION RENAME)
37 | # set(multiValueArgs TARGETS CONFIGURATIONS)
38 | # cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
39 | # ...
40 | #
41 | # Assume my_install() has been called like this:
42 | # my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
43 | #
44 | # After the cmake_parse_arguments() call the macro will have set the following
45 | # variables:
46 | # MY_INSTALL_OPTIONAL = TRUE
47 | # MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
48 | # MY_INSTALL_DESTINATION = "bin"
49 | # MY_INSTALL_RENAME = "" (was not used)
50 | # MY_INSTALL_TARGETS = "foo;bar"
51 | # MY_INSTALL_CONFIGURATIONS = "" (was not used)
52 | # MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
53 | #
54 | # You can the continue and process these variables.
55 | #
56 | # Keywords terminate lists of values, e.g. if directly after a one_value_keyword
57 | # another recognized keyword follows, this is interpreted as the beginning of
58 | # the new option.
59 | # E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
60 | # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
61 | # be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
62 |
63 | #=============================================================================
64 | # Copyright 2010 Alexander Neundorf
65 | #
66 | # Distributed under the OSI-approved BSD License (the "License");
67 | # see accompanying file Copyright.txt for details.
68 | #
69 | # This software is distributed WITHOUT ANY WARRANTY; without even the
70 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
71 | # See the License for more information.
72 | #=============================================================================
73 | # (To distribute this file outside of CMake, substitute the full
74 | # License text for the above reference.)
75 |
76 |
77 | if(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
78 | return()
79 | endif()
80 | set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)
81 |
82 |
83 | function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
84 | # first set all result variables to empty/FALSE
85 | foreach(arg_name ${_singleArgNames} ${_multiArgNames})
86 | set(${prefix}_${arg_name})
87 | endforeach(arg_name)
88 |
89 | foreach(option ${_optionNames})
90 | set(${prefix}_${option} FALSE)
91 | endforeach(option)
92 |
93 | set(${prefix}_UNPARSED_ARGUMENTS)
94 |
95 | set(insideValues FALSE)
96 | set(currentArgName)
97 |
98 | # now iterate over all arguments and fill the result variables
99 | foreach(currentArg ${ARGN})
100 | list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
101 | list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
102 | list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword
103 |
104 | if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
105 | if(insideValues)
106 | if("${insideValues}" STREQUAL "SINGLE")
107 | set(${prefix}_${currentArgName} ${currentArg})
108 | set(insideValues FALSE)
109 | elseif("${insideValues}" STREQUAL "MULTI")
110 | list(APPEND ${prefix}_${currentArgName} ${currentArg})
111 | endif()
112 | else(insideValues)
113 | list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
114 | endif(insideValues)
115 | else()
116 | if(NOT ${optionIndex} EQUAL -1)
117 | set(${prefix}_${currentArg} TRUE)
118 | set(insideValues FALSE)
119 | elseif(NOT ${singleArgIndex} EQUAL -1)
120 | set(currentArgName ${currentArg})
121 | set(${prefix}_${currentArgName})
122 | set(insideValues "SINGLE")
123 | elseif(NOT ${multiArgIndex} EQUAL -1)
124 | set(currentArgName ${currentArg})
125 | set(${prefix}_${currentArgName})
126 | set(insideValues "MULTI")
127 | endif()
128 | endif()
129 |
130 | endforeach(currentArg)
131 |
132 | # propagate the result variables to the caller:
133 | foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
134 | set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
135 | endforeach(arg_name)
136 | set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)
137 |
138 | endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs)
139 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/doxyindex.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Classes providing more user-friendly interfaces to the doxygen xml
23 | docs than the generated classes provide.
24 | """
25 |
26 | import os
27 |
28 | from generated import index
29 | from base import Base
30 | from text import description
31 |
32 | class DoxyIndex(Base):
33 | """
34 | Parses a doxygen xml directory.
35 | """
36 |
37 | __module__ = "gnuradio.utils.doxyxml"
38 |
39 | def _parse(self):
40 | if self._parsed:
41 | return
42 | super(DoxyIndex, self)._parse()
43 | self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
44 | for mem in self._root.compound:
45 | converted = self.convert_mem(mem)
46 | # For files we want the contents to be accessible directly
47 | # from the parent rather than having to go through the file
48 | # object.
49 | if self.get_cls(mem) == DoxyFile:
50 | if mem.name.endswith('.h'):
51 | self._members += converted.members()
52 | self._members.append(converted)
53 | else:
54 | self._members.append(converted)
55 |
56 |
57 | def generate_swig_doc_i(self):
58 | """
59 | %feature("docstring") gr_make_align_on_samplenumbers_ss::align_state "
60 | Wraps the C++: gr_align_on_samplenumbers_ss::align_state";
61 | """
62 | pass
63 |
64 |
65 | class DoxyCompMem(Base):
66 |
67 |
68 | kind = None
69 |
70 | def __init__(self, *args, **kwargs):
71 | super(DoxyCompMem, self).__init__(*args, **kwargs)
72 |
73 | @classmethod
74 | def can_parse(cls, obj):
75 | return obj.kind == cls.kind
76 |
77 | def set_descriptions(self, parse_data):
78 | bd = description(getattr(parse_data, 'briefdescription', None))
79 | dd = description(getattr(parse_data, 'detaileddescription', None))
80 | self._data['brief_description'] = bd
81 | self._data['detailed_description'] = dd
82 |
83 | class DoxyCompound(DoxyCompMem):
84 | pass
85 |
86 | class DoxyMember(DoxyCompMem):
87 | pass
88 |
89 |
90 | class DoxyFunction(DoxyMember):
91 |
92 | __module__ = "gnuradio.utils.doxyxml"
93 |
94 | kind = 'function'
95 |
96 | def _parse(self):
97 | if self._parsed:
98 | return
99 | super(DoxyFunction, self)._parse()
100 | self.set_descriptions(self._parse_data)
101 | self._data['params'] = []
102 | prms = self._parse_data.param
103 | for prm in prms:
104 | self._data['params'].append(DoxyParam(prm))
105 |
106 | brief_description = property(lambda self: self.data()['brief_description'])
107 | detailed_description = property(lambda self: self.data()['detailed_description'])
108 | params = property(lambda self: self.data()['params'])
109 |
110 | Base.mem_classes.append(DoxyFunction)
111 |
112 |
113 | class DoxyParam(DoxyMember):
114 |
115 | __module__ = "gnuradio.utils.doxyxml"
116 |
117 | def _parse(self):
118 | if self._parsed:
119 | return
120 | super(DoxyParam, self)._parse()
121 | self.set_descriptions(self._parse_data)
122 | self._data['declname'] = self._parse_data.declname
123 |
124 | brief_description = property(lambda self: self.data()['brief_description'])
125 | detailed_description = property(lambda self: self.data()['detailed_description'])
126 | declname = property(lambda self: self.data()['declname'])
127 |
128 | class DoxyClass(DoxyCompound):
129 |
130 | __module__ = "gnuradio.utils.doxyxml"
131 |
132 | kind = 'class'
133 |
134 | def _parse(self):
135 | if self._parsed:
136 | return
137 | super(DoxyClass, self)._parse()
138 | self.retrieve_data()
139 | if self._error:
140 | return
141 | self.set_descriptions(self._retrieved_data.compounddef)
142 | # Sectiondef.kind tells about whether private or public.
143 | # We just ignore this for now.
144 | self.process_memberdefs()
145 |
146 | brief_description = property(lambda self: self.data()['brief_description'])
147 | detailed_description = property(lambda self: self.data()['detailed_description'])
148 |
149 | Base.mem_classes.append(DoxyClass)
150 |
151 |
152 | class DoxyFile(DoxyCompound):
153 |
154 | __module__ = "gnuradio.utils.doxyxml"
155 |
156 | kind = 'file'
157 |
158 | def _parse(self):
159 | if self._parsed:
160 | return
161 | super(DoxyFile, self)._parse()
162 | self.retrieve_data()
163 | self.set_descriptions(self._retrieved_data.compounddef)
164 | if self._error:
165 | return
166 | self.process_memberdefs()
167 |
168 | brief_description = property(lambda self: self.data()['brief_description'])
169 | detailed_description = property(lambda self: self.data()['detailed_description'])
170 |
171 | Base.mem_classes.append(DoxyFile)
172 |
173 |
174 | class DoxyNamespace(DoxyCompound):
175 |
176 | __module__ = "gnuradio.utils.doxyxml"
177 |
178 | kind = 'namespace'
179 |
180 | Base.mem_classes.append(DoxyNamespace)
181 |
182 |
183 | class DoxyGroup(DoxyCompound):
184 |
185 | __module__ = "gnuradio.utils.doxyxml"
186 |
187 | kind = 'group'
188 |
189 | def _parse(self):
190 | if self._parsed:
191 | return
192 | super(DoxyGroup, self)._parse()
193 | self.retrieve_data()
194 | if self._error:
195 | return
196 | cdef = self._retrieved_data.compounddef
197 | self._data['title'] = description(cdef.title)
198 | # Process inner groups
199 | grps = cdef.innergroup
200 | for grp in grps:
201 | converted = DoxyGroup.from_refid(grp.refid, top=self.top)
202 | self._members.append(converted)
203 | # Process inner classes
204 | klasses = cdef.innerclass
205 | for kls in klasses:
206 | converted = DoxyClass.from_refid(kls.refid, top=self.top)
207 | self._members.append(converted)
208 | # Process normal members
209 | self.process_memberdefs()
210 |
211 | title = property(lambda self: self.data()['title'])
212 |
213 |
214 | Base.mem_classes.append(DoxyGroup)
215 |
216 |
217 | class DoxyFriend(DoxyMember):
218 |
219 | __module__ = "gnuradio.utils.doxyxml"
220 |
221 | kind = 'friend'
222 |
223 | Base.mem_classes.append(DoxyFriend)
224 |
225 |
226 | class DoxyOther(Base):
227 |
228 | __module__ = "gnuradio.utils.doxyxml"
229 |
230 | kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum', 'dir', 'page'])
231 |
232 | @classmethod
233 | def can_parse(cls, obj):
234 | return obj.kind in cls.kinds
235 |
236 | Base.mem_classes.append(DoxyOther)
237 |
238 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/base.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | A base class is created.
23 |
24 | Classes based upon this are used to make more user-friendly interfaces
25 | to the doxygen xml docs than the generated classes provide.
26 | """
27 |
28 | import os
29 | import pdb
30 |
31 | from xml.parsers.expat import ExpatError
32 |
33 | from generated import compound
34 |
35 |
36 | class Base(object):
37 |
38 | class Duplicate(StandardError):
39 | pass
40 |
41 | class NoSuchMember(StandardError):
42 | pass
43 |
44 | class ParsingError(StandardError):
45 | pass
46 |
47 | def __init__(self, parse_data, top=None):
48 | self._parsed = False
49 | self._error = False
50 | self._parse_data = parse_data
51 | self._members = []
52 | self._dict_members = {}
53 | self._in_category = {}
54 | self._data = {}
55 | if top is not None:
56 | self._xml_path = top._xml_path
57 | # Set up holder of references
58 | else:
59 | top = self
60 | self._refs = {}
61 | self._xml_path = parse_data
62 | self.top = top
63 |
64 | @classmethod
65 | def from_refid(cls, refid, top=None):
66 | """ Instantiate class from a refid rather than parsing object. """
67 | # First check to see if its already been instantiated.
68 | if top is not None and refid in top._refs:
69 | return top._refs[refid]
70 | # Otherwise create a new instance and set refid.
71 | inst = cls(None, top=top)
72 | inst.refid = refid
73 | inst.add_ref(inst)
74 | return inst
75 |
76 | @classmethod
77 | def from_parse_data(cls, parse_data, top=None):
78 | refid = getattr(parse_data, 'refid', None)
79 | if refid is not None and top is not None and refid in top._refs:
80 | return top._refs[refid]
81 | inst = cls(parse_data, top=top)
82 | if refid is not None:
83 | inst.refid = refid
84 | inst.add_ref(inst)
85 | return inst
86 |
87 | def add_ref(self, obj):
88 | if hasattr(obj, 'refid'):
89 | self.top._refs[obj.refid] = obj
90 |
91 | mem_classes = []
92 |
93 | def get_cls(self, mem):
94 | for cls in self.mem_classes:
95 | if cls.can_parse(mem):
96 | return cls
97 | raise StandardError(("Did not find a class for object '%s'." \
98 | % (mem.get_name())))
99 |
100 | def convert_mem(self, mem):
101 | try:
102 | cls = self.get_cls(mem)
103 | converted = cls.from_parse_data(mem, self.top)
104 | if converted is None:
105 | raise StandardError('No class matched this object.')
106 | self.add_ref(converted)
107 | return converted
108 | except StandardError, e:
109 | print e
110 |
111 | @classmethod
112 | def includes(cls, inst):
113 | return isinstance(inst, cls)
114 |
115 | @classmethod
116 | def can_parse(cls, obj):
117 | return False
118 |
119 | def _parse(self):
120 | self._parsed = True
121 |
122 | def _get_dict_members(self, cat=None):
123 | """
124 | For given category a dictionary is returned mapping member names to
125 | members of that category. For names that are duplicated the name is
126 | mapped to None.
127 | """
128 | self.confirm_no_error()
129 | if cat not in self._dict_members:
130 | new_dict = {}
131 | for mem in self.in_category(cat):
132 | if mem.name() not in new_dict:
133 | new_dict[mem.name()] = mem
134 | else:
135 | new_dict[mem.name()] = self.Duplicate
136 | self._dict_members[cat] = new_dict
137 | return self._dict_members[cat]
138 |
139 | def in_category(self, cat):
140 | self.confirm_no_error()
141 | if cat is None:
142 | return self._members
143 | if cat not in self._in_category:
144 | self._in_category[cat] = [mem for mem in self._members
145 | if cat.includes(mem)]
146 | return self._in_category[cat]
147 |
148 | def get_member(self, name, cat=None):
149 | self.confirm_no_error()
150 | # Check if it's in a namespace or class.
151 | bits = name.split('::')
152 | first = bits[0]
153 | rest = '::'.join(bits[1:])
154 | member = self._get_dict_members(cat).get(first, self.NoSuchMember)
155 | # Raise any errors that are returned.
156 | if member in set([self.NoSuchMember, self.Duplicate]):
157 | raise member()
158 | if rest:
159 | return member.get_member(rest, cat=cat)
160 | return member
161 |
162 | def has_member(self, name, cat=None):
163 | try:
164 | mem = self.get_member(name, cat=cat)
165 | return True
166 | except self.NoSuchMember:
167 | return False
168 |
169 | def data(self):
170 | self.confirm_no_error()
171 | return self._data
172 |
173 | def members(self):
174 | self.confirm_no_error()
175 | return self._members
176 |
177 | def process_memberdefs(self):
178 | mdtss = []
179 | for sec in self._retrieved_data.compounddef.sectiondef:
180 | mdtss += sec.memberdef
181 | # At the moment we lose all information associated with sections.
182 | # Sometimes a memberdef is in several sectiondef.
183 | # We make sure we don't get duplicates here.
184 | uniques = set([])
185 | for mem in mdtss:
186 | converted = self.convert_mem(mem)
187 | pair = (mem.name, mem.__class__)
188 | if pair not in uniques:
189 | uniques.add(pair)
190 | self._members.append(converted)
191 |
192 | def retrieve_data(self):
193 | filename = os.path.join(self._xml_path, self.refid + '.xml')
194 | try:
195 | self._retrieved_data = compound.parse(filename)
196 | except ExpatError:
197 | print('Error in xml in file %s' % filename)
198 | self._error = True
199 | self._retrieved_data = None
200 |
201 | def check_parsed(self):
202 | if not self._parsed:
203 | self._parse()
204 |
205 | def confirm_no_error(self):
206 | self.check_parsed()
207 | if self._error:
208 | raise self.ParsingError()
209 |
210 | def error(self):
211 | self.check_parsed()
212 | return self._error
213 |
214 | def name(self):
215 | # first see if we can do it without processing.
216 | if self._parse_data is not None:
217 | return self._parse_data.name
218 | self.check_parsed()
219 | return self._retrieved_data.compounddef.name
220 |
--------------------------------------------------------------------------------
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011,2012,2014 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Project setup
22 | ########################################################################
23 | cmake_minimum_required(VERSION 2.6)
24 | project(gr-vlc CXX C)
25 | enable_testing()
26 |
27 | #select the release build type by default to get optimization flags
28 | if(NOT CMAKE_BUILD_TYPE)
29 | set(CMAKE_BUILD_TYPE "Release")
30 | message(STATUS "Build type not specified: defaulting to release.")
31 | endif(NOT CMAKE_BUILD_TYPE)
32 | set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
33 |
34 | #make sure our local CMake Modules path comes first
35 | list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
36 |
37 | ########################################################################
38 | # Compiler specific setup
39 | ########################################################################
40 | if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
41 | #http://gcc.gnu.org/wiki/Visibility
42 | add_definitions(-fvisibility=hidden)
43 | endif()
44 |
45 | ########################################################################
46 | # Find boost
47 | ########################################################################
48 | if(UNIX AND EXISTS "/usr/lib64")
49 | list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
50 | endif(UNIX AND EXISTS "/usr/lib64")
51 | set(Boost_ADDITIONAL_VERSIONS
52 | "1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39"
53 | "1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
54 | "1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49"
55 | "1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54"
56 | "1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
57 | "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
58 | "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
59 | )
60 | find_package(Boost "1.35" COMPONENTS filesystem system)
61 |
62 | if(NOT Boost_FOUND)
63 | message(FATAL_ERROR "Boost required to compile vlc")
64 | endif()
65 |
66 | ########################################################################
67 | # Install directories
68 | ########################################################################
69 | include(GrPlatform) #define LIB_SUFFIX
70 | set(GR_RUNTIME_DIR bin)
71 | set(GR_LIBRARY_DIR lib${LIB_SUFFIX})
72 | set(GR_INCLUDE_DIR include/vlc)
73 | set(GR_DATA_DIR share)
74 | set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
75 | set(GR_DOC_DIR ${GR_DATA_DIR}/doc)
76 | set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
77 | set(GR_CONF_DIR etc)
78 | set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
79 | set(GR_LIBEXEC_DIR libexec)
80 | set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
81 | set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks)
82 |
83 | ########################################################################
84 | # On Apple only, set install name and use rpath correctly, if not already set
85 | ########################################################################
86 | if(APPLE)
87 | if(NOT CMAKE_INSTALL_NAME_DIR)
88 | set(CMAKE_INSTALL_NAME_DIR
89 | ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
90 | PATH "Library Install Name Destination Directory" FORCE)
91 | endif(NOT CMAKE_INSTALL_NAME_DIR)
92 | if(NOT CMAKE_INSTALL_RPATH)
93 | set(CMAKE_INSTALL_RPATH
94 | ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
95 | PATH "Library Install RPath" FORCE)
96 | endif(NOT CMAKE_INSTALL_RPATH)
97 | if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
98 | set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE
99 | BOOL "Do Build Using Library Install RPath" FORCE)
100 | endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
101 | endif(APPLE)
102 |
103 | ########################################################################
104 | # Find gnuradio build dependencies
105 | ########################################################################
106 | find_package(CppUnit)
107 | find_package(Doxygen)
108 |
109 | # Search for GNU Radio and its components and versions. Add any
110 | # components required to the list of GR_REQUIRED_COMPONENTS (in all
111 | # caps such as FILTER or FFT) and change the version to the minimum
112 | # API compatible version required.
113 | set(GR_REQUIRED_COMPONENTS RUNTIME)
114 | find_package(Gnuradio "3.7.2" REQUIRED)
115 |
116 | if(NOT CPPUNIT_FOUND)
117 | message(FATAL_ERROR "CppUnit required to compile vlc")
118 | endif()
119 |
120 | ########################################################################
121 | # Setup doxygen option
122 | ########################################################################
123 | if(DOXYGEN_FOUND)
124 | option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
125 | else(DOXYGEN_FOUND)
126 | option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
127 | endif(DOXYGEN_FOUND)
128 |
129 | ########################################################################
130 | # Setup the include and linker paths
131 | ########################################################################
132 | include_directories(
133 | ${CMAKE_SOURCE_DIR}/lib
134 | ${CMAKE_SOURCE_DIR}/include
135 | ${CMAKE_BINARY_DIR}/lib
136 | ${CMAKE_BINARY_DIR}/include
137 | ${Boost_INCLUDE_DIRS}
138 | ${CPPUNIT_INCLUDE_DIRS}
139 | ${GNURADIO_ALL_INCLUDE_DIRS}
140 | )
141 |
142 | link_directories(
143 | ${Boost_LIBRARY_DIRS}
144 | ${CPPUNIT_LIBRARY_DIRS}
145 | ${GNURADIO_RUNTIME_LIBRARY_DIRS}
146 | )
147 |
148 | # Set component parameters
149 | set(GR_VLC_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
150 | set(GR_VLC_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
151 |
152 | ########################################################################
153 | # Create uninstall target
154 | ########################################################################
155 | configure_file(
156 | ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
157 | ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
158 | @ONLY)
159 |
160 | add_custom_target(uninstall
161 | ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
162 | )
163 |
164 | ########################################################################
165 | # Add subdirectories
166 | ########################################################################
167 | add_subdirectory(include/vlc)
168 | add_subdirectory(lib)
169 | add_subdirectory(swig)
170 | add_subdirectory(python)
171 | add_subdirectory(grc)
172 | add_subdirectory(apps)
173 | add_subdirectory(docs)
174 |
175 | ########################################################################
176 | # Install cmake search helper for this library
177 | ########################################################################
178 | if(NOT CMAKE_MODULES_DIR)
179 | set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
180 | endif(NOT CMAKE_MODULES_DIR)
181 |
182 | install(FILES cmake/Modules/vlcConfig.cmake
183 | DESTINATION ${CMAKE_MODULES_DIR}/vlc
184 | )
185 |
--------------------------------------------------------------------------------
/python/build_utils.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2004,2009,2012 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 |
22 | """Misc utilities used at build time
23 | """
24 |
25 | import re, os, os.path
26 | from build_utils_codes import *
27 |
28 |
29 | # set srcdir to the directory that contains Makefile.am
30 | try:
31 | srcdir = os.environ['srcdir']
32 | except KeyError, e:
33 | srcdir = "."
34 | srcdir = srcdir + '/'
35 |
36 | # set do_makefile to either true or false dependeing on the environment
37 | try:
38 | if os.environ['do_makefile'] == '0':
39 | do_makefile = False
40 | else:
41 | do_makefile = True
42 | except KeyError, e:
43 | do_makefile = False
44 |
45 | # set do_sources to either true or false dependeing on the environment
46 | try:
47 | if os.environ['do_sources'] == '0':
48 | do_sources = False
49 | else:
50 | do_sources = True
51 | except KeyError, e:
52 | do_sources = True
53 |
54 | name_dict = {}
55 |
56 | def log_output_name (name):
57 | (base, ext) = os.path.splitext (name)
58 | ext = ext[1:] # drop the leading '.'
59 |
60 | entry = name_dict.setdefault (ext, [])
61 | entry.append (name)
62 |
63 | def open_and_log_name (name, dir):
64 | global do_sources
65 | if do_sources:
66 | f = open (name, dir)
67 | else:
68 | f = None
69 | log_output_name (name)
70 | return f
71 |
72 | def expand_template (d, template_filename, extra = ""):
73 | '''Given a dictionary D and a TEMPLATE_FILENAME, expand template into output file
74 | '''
75 | global do_sources
76 | output_extension = extract_extension (template_filename)
77 | template = open_src (template_filename, 'r')
78 | output_name = d['NAME'] + extra + '.' + output_extension
79 | log_output_name (output_name)
80 | if do_sources:
81 | output = open (output_name, 'w')
82 | do_substitution (d, template, output)
83 | output.close ()
84 | template.close ()
85 |
86 | def output_glue (dirname):
87 | output_makefile_fragment ()
88 | output_ifile_include (dirname)
89 |
90 | def output_makefile_fragment ():
91 | global do_makefile
92 | if not do_makefile:
93 | return
94 | # overwrite the source, which must be writable; this should have been
95 | # checked for beforehand in the top-level Makefile.gen.gen .
96 | f = open (os.path.join (os.environ.get('gendir', os.environ.get('srcdir', '.')), 'Makefile.gen'), 'w')
97 | f.write ('#\n# This file is machine generated. All edits will be overwritten\n#\n')
98 | output_subfrag (f, 'h')
99 | output_subfrag (f, 'i')
100 | output_subfrag (f, 'cc')
101 | f.close ()
102 |
103 | def output_ifile_include (dirname):
104 | global do_sources
105 | if do_sources:
106 | f = open ('%s_generated.i' % (dirname,), 'w')
107 | f.write ('//\n// This file is machine generated. All edits will be overwritten\n//\n')
108 | files = name_dict.setdefault ('i', [])
109 | files.sort ()
110 | f.write ('%{\n')
111 | for file in files:
112 | f.write ('#include <%s>\n' % (file[0:-1] + 'h',))
113 | f.write ('%}\n\n')
114 | for file in files:
115 | f.write ('%%include <%s>\n' % (file,))
116 |
117 | def output_subfrag (f, ext):
118 | files = name_dict.setdefault (ext, [])
119 | files.sort ()
120 | f.write ("GENERATED_%s =" % (ext.upper ()))
121 | for file in files:
122 | f.write (" \\\n\t%s" % (file,))
123 | f.write ("\n\n")
124 |
125 | def extract_extension (template_name):
126 | # template name is something like: GrFIRfilterXXX.h.t
127 | # we return everything between the penultimate . and .t
128 | mo = re.search (r'\.([a-z]+)\.t$', template_name)
129 | if not mo:
130 | raise ValueError, "Incorrectly formed template_name '%s'" % (template_name,)
131 | return mo.group (1)
132 |
133 | def open_src (name, mode):
134 | global srcdir
135 | return open (os.path.join (srcdir, name), mode)
136 |
137 | def do_substitution (d, in_file, out_file):
138 | def repl (match_obj):
139 | key = match_obj.group (1)
140 | # print key
141 | return d[key]
142 |
143 | inp = in_file.read ()
144 | out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, inp)
145 | out_file.write (out)
146 |
147 |
148 |
149 | copyright = '''/* -*- c++ -*- */
150 | /*
151 | * Copyright 2003,2004 Free Software Foundation, Inc.
152 | *
153 | * This file is part of GNU Radio
154 | *
155 | * GNU Radio is free software; you can redistribute it and/or modify
156 | * it under the terms of the GNU General Public License as published by
157 | * the Free Software Foundation; either version 3, or (at your option)
158 | * any later version.
159 | *
160 | * GNU Radio is distributed in the hope that it will be useful,
161 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
162 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
163 | * GNU General Public License for more details.
164 | *
165 | * You should have received a copy of the GNU General Public License
166 | * along with GNU Radio; see the file COPYING. If not, write to
167 | * the Free Software Foundation, Inc., 51 Franklin Street,
168 | * Boston, MA 02110-1301, USA.
169 | */
170 | '''
171 |
172 | def is_complex (code3):
173 | if i_code (code3) == 'c' or o_code (code3) == 'c':
174 | return '1'
175 | else:
176 | return '0'
177 |
178 |
179 | def standard_dict (name, code3, package='gr'):
180 | d = {}
181 | d['NAME'] = name
182 | d['NAME_IMPL'] = name+'_impl'
183 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
184 | d['GUARD_NAME_IMPL'] = 'INCLUDED_%s_%s_IMPL_H' % (package.upper(), name.upper())
185 | d['BASE_NAME'] = re.sub ('^' + package + '_', '', name)
186 | d['SPTR_NAME'] = '%s_sptr' % name
187 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
188 | d['COPYRIGHT'] = copyright
189 | d['TYPE'] = i_type (code3)
190 | d['I_TYPE'] = i_type (code3)
191 | d['O_TYPE'] = o_type (code3)
192 | d['TAP_TYPE'] = tap_type (code3)
193 | d['IS_COMPLEX'] = is_complex (code3)
194 | return d
195 |
196 |
197 | def standard_dict2 (name, code3, package):
198 | d = {}
199 | d['NAME'] = name
200 | d['BASE_NAME'] = name
201 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
202 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
203 | d['COPYRIGHT'] = copyright
204 | d['TYPE'] = i_type (code3)
205 | d['I_TYPE'] = i_type (code3)
206 | d['O_TYPE'] = o_type (code3)
207 | d['TAP_TYPE'] = tap_type (code3)
208 | d['IS_COMPLEX'] = is_complex (code3)
209 | return d
210 |
211 | def standard_impl_dict2 (name, code3, package):
212 | d = {}
213 | d['NAME'] = name
214 | d['IMPL_NAME'] = name
215 | d['BASE_NAME'] = name.rstrip("impl").rstrip("_")
216 | d['GUARD_NAME'] = 'INCLUDED_%s_%s_H' % (package.upper(), name.upper())
217 | d['WARNING'] = 'WARNING: this file is machine generated. Edits will be overwritten'
218 | d['COPYRIGHT'] = copyright
219 | d['FIR_TYPE'] = "fir_filter_" + code3
220 | d['CFIR_TYPE'] = "fir_filter_" + code3[0:2] + 'c'
221 | d['TYPE'] = i_type (code3)
222 | d['I_TYPE'] = i_type (code3)
223 | d['O_TYPE'] = o_type (code3)
224 | d['TAP_TYPE'] = tap_type (code3)
225 | d['IS_COMPLEX'] = is_complex (code3)
226 | return d
227 |
--------------------------------------------------------------------------------
/examples/Relative_Channel_Test.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python2
2 | # -*- coding: utf-8 -*-
3 | ##################################################
4 | # GNU Radio Python Flow Graph
5 | # Title: Test flow graph for the VLC channel model
6 | # Author: Michael
7 | # Description: Test for VLC channel model with dynamic distance, eission angle, and acceptance angle
8 | # Generated: Mon Jul 11 22:57:23 2016
9 | ##################################################
10 |
11 | if __name__ == '__main__':
12 | import ctypes
13 | import sys
14 | if sys.platform.startswith('linux'):
15 | try:
16 | x11 = ctypes.cdll.LoadLibrary('libX11.so')
17 | x11.XInitThreads()
18 | except:
19 | print "Warning: failed to XInitThreads()"
20 |
21 | from PyQt4 import Qt
22 | from gnuradio import analog
23 | from gnuradio import blocks
24 | from gnuradio import eng_notation
25 | from gnuradio import gr
26 | from gnuradio import qtgui
27 | from gnuradio.eng_option import eng_option
28 | from gnuradio.filter import firdes
29 | from gnuradio.qtgui import Range, RangeWidget
30 | from optparse import OptionParser
31 | import sip
32 | import sys
33 | import vlc
34 |
35 |
36 | class Relative_Channel_Test(gr.top_block, Qt.QWidget):
37 |
38 | def __init__(self):
39 | gr.top_block.__init__(self, "Test flow graph for the VLC channel model")
40 | Qt.QWidget.__init__(self)
41 | self.setWindowTitle("Test flow graph for the VLC channel model")
42 | try:
43 | self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
44 | except:
45 | pass
46 | self.top_scroll_layout = Qt.QVBoxLayout()
47 | self.setLayout(self.top_scroll_layout)
48 | self.top_scroll = Qt.QScrollArea()
49 | self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
50 | self.top_scroll_layout.addWidget(self.top_scroll)
51 | self.top_scroll.setWidgetResizable(True)
52 | self.top_widget = Qt.QWidget()
53 | self.top_scroll.setWidget(self.top_widget)
54 | self.top_layout = Qt.QVBoxLayout(self.top_widget)
55 | self.top_grid_layout = Qt.QGridLayout()
56 | self.top_layout.addLayout(self.top_grid_layout)
57 |
58 | self.settings = Qt.QSettings("GNU Radio", "Relative_Channel_Test")
59 | self.restoreGeometry(self.settings.value("geometry").toByteArray())
60 |
61 | ##################################################
62 | # Variables
63 | ##################################################
64 | self.samp_rate = samp_rate = 32000
65 | self.my_psi = my_psi = 50
66 | self.my_phi = my_phi = 50
67 | self.my_d = my_d = 2
68 |
69 | ##################################################
70 | # Blocks
71 | ##################################################
72 | self._my_psi_range = Range(0, 90, 1, 50, 200)
73 | self._my_psi_win = RangeWidget(self._my_psi_range, self.set_my_psi, "Acceptance Angle (deg)", "counter_slider", float)
74 | self.top_layout.addWidget(self._my_psi_win)
75 | self._my_phi_range = Range(0, 90, 1, 50, 200)
76 | self._my_phi_win = RangeWidget(self._my_phi_range, self.set_my_phi, "Emission Angle (deg)", "counter_slider", float)
77 | self.top_layout.addWidget(self._my_phi_win)
78 | self._my_d_range = Range(0, 10, 0.1, 2, 200)
79 | self._my_d_win = RangeWidget(self._my_d_range, self.set_my_d, "Distance (m)", "counter_slider", float)
80 | self.top_layout.addWidget(self._my_d_win)
81 | self.vlc_channel_relative_0 = vlc.channel_relative(my_phi, my_psi, my_d, 1, 0.001, 1, 90, 1, 1)
82 | self.qtgui_time_sink_x_0 = qtgui.time_sink_f(
83 | 1024, #size
84 | samp_rate, #samp_rate
85 | "", #name
86 | 1 #number of inputs
87 | )
88 | self.qtgui_time_sink_x_0.set_update_time(0.10)
89 | self.qtgui_time_sink_x_0.set_y_axis(-1, 1)
90 |
91 | self.qtgui_time_sink_x_0.set_y_label("Amplitude", "")
92 |
93 | self.qtgui_time_sink_x_0.enable_tags(-1, True)
94 | self.qtgui_time_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
95 | self.qtgui_time_sink_x_0.enable_autoscale(True)
96 | self.qtgui_time_sink_x_0.enable_grid(False)
97 | self.qtgui_time_sink_x_0.enable_control_panel(False)
98 |
99 | if not True:
100 | self.qtgui_time_sink_x_0.disable_legend()
101 |
102 | labels = ["", "", "", "", "",
103 | "", "", "", "", ""]
104 | widths = [1, 1, 1, 1, 1,
105 | 1, 1, 1, 1, 1]
106 | colors = ["blue", "red", "green", "black", "cyan",
107 | "magenta", "yellow", "dark red", "dark green", "blue"]
108 | styles = [1, 1, 1, 1, 1,
109 | 1, 1, 1, 1, 1]
110 | markers = [-1, -1, -1, -1, -1,
111 | -1, -1, -1, -1, -1]
112 | alphas = [1.0, 1.0, 1.0, 1.0, 1.0,
113 | 1.0, 1.0, 1.0, 1.0, 1.0]
114 |
115 | for i in xrange(1):
116 | if len(labels[i]) == 0:
117 | self.qtgui_time_sink_x_0.set_line_label(i, "Data {0}".format(i))
118 | else:
119 | self.qtgui_time_sink_x_0.set_line_label(i, labels[i])
120 | self.qtgui_time_sink_x_0.set_line_width(i, widths[i])
121 | self.qtgui_time_sink_x_0.set_line_color(i, colors[i])
122 | self.qtgui_time_sink_x_0.set_line_style(i, styles[i])
123 | self.qtgui_time_sink_x_0.set_line_marker(i, markers[i])
124 | self.qtgui_time_sink_x_0.set_line_alpha(i, alphas[i])
125 |
126 | self._qtgui_time_sink_x_0_win = sip.wrapinstance(self.qtgui_time_sink_x_0.pyqwidget(), Qt.QWidget)
127 | self.top_layout.addWidget(self._qtgui_time_sink_x_0_win)
128 | self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, samp_rate,True)
129 | self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 1000, 1, 0)
130 |
131 | ##################################################
132 | # Connections
133 | ##################################################
134 | self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0))
135 | self.connect((self.blocks_throttle_0, 0), (self.vlc_channel_relative_0, 0))
136 | self.connect((self.vlc_channel_relative_0, 0), (self.qtgui_time_sink_x_0, 0))
137 |
138 | def closeEvent(self, event):
139 | self.settings = Qt.QSettings("GNU Radio", "Relative_Channel_Test")
140 | self.settings.setValue("geometry", self.saveGeometry())
141 | event.accept()
142 |
143 |
144 | def get_samp_rate(self):
145 | return self.samp_rate
146 |
147 | def set_samp_rate(self, samp_rate):
148 | self.samp_rate = samp_rate
149 | self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate)
150 | self.blocks_throttle_0.set_sample_rate(self.samp_rate)
151 | self.qtgui_time_sink_x_0.set_samp_rate(self.samp_rate)
152 |
153 | def get_my_psi(self):
154 | return self.my_psi
155 |
156 | def set_my_psi(self, my_psi):
157 | self.my_psi = my_psi
158 | self.vlc_channel_relative_0.set_psi(self.my_psi)
159 |
160 | def get_my_phi(self):
161 | return self.my_phi
162 |
163 | def set_my_phi(self, my_phi):
164 | self.my_phi = my_phi
165 | self.vlc_channel_relative_0.set_phi(self.my_phi)
166 |
167 | def get_my_d(self):
168 | return self.my_d
169 |
170 | def set_my_d(self, my_d):
171 | self.my_d = my_d
172 | self.vlc_channel_relative_0.set_d(self.my_d)
173 |
174 |
175 | def main(top_block_cls=Relative_Channel_Test, options=None):
176 |
177 | from distutils.version import StrictVersion
178 | if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
179 | style = gr.prefs().get_string('qtgui', 'style', 'raster')
180 | Qt.QApplication.setGraphicsSystem(style)
181 | qapp = Qt.QApplication(sys.argv)
182 |
183 | tb = top_block_cls()
184 | tb.start()
185 | tb.show()
186 |
187 | def quitting():
188 | tb.stop()
189 | tb.wait()
190 | qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
191 | qapp.exec_()
192 |
193 |
194 | if __name__ == '__main__':
195 | main()
196 |
--------------------------------------------------------------------------------
/docs/doxygen/swig_doc.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010,2011 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Creates the swig_doc.i SWIG interface file.
23 | Execute using: python swig_doc.py xml_path outputfilename
24 |
25 | The file instructs SWIG to transfer the doxygen comments into the
26 | python docstrings.
27 |
28 | """
29 |
30 | import sys
31 |
32 | try:
33 | from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
34 | except ImportError:
35 | from gnuradio.doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
36 |
37 |
38 | def py_name(name):
39 | bits = name.split('_')
40 | return '_'.join(bits[1:])
41 |
42 | def make_name(name):
43 | bits = name.split('_')
44 | return bits[0] + '_make_' + '_'.join(bits[1:])
45 |
46 |
47 | class Block(object):
48 | """
49 | Checks if doxyxml produced objects correspond to a gnuradio block.
50 | """
51 |
52 | @classmethod
53 | def includes(cls, item):
54 | if not isinstance(item, DoxyClass):
55 | return False
56 | # Check for a parsing error.
57 | if item.error():
58 | return False
59 | return item.has_member(make_name(item.name()), DoxyFriend)
60 |
61 |
62 | def utoascii(text):
63 | """
64 | Convert unicode text into ascii and escape quotes.
65 | """
66 | if text is None:
67 | return ''
68 | out = text.encode('ascii', 'replace')
69 | out = out.replace('"', '\\"')
70 | return out
71 |
72 |
73 | def combine_descriptions(obj):
74 | """
75 | Combines the brief and detailed descriptions of an object together.
76 | """
77 | description = []
78 | bd = obj.brief_description.strip()
79 | dd = obj.detailed_description.strip()
80 | if bd:
81 | description.append(bd)
82 | if dd:
83 | description.append(dd)
84 | return utoascii('\n\n'.join(description)).strip()
85 |
86 |
87 | entry_templ = '%feature("docstring") {name} "{docstring}"'
88 | def make_entry(obj, name=None, templ="{description}", description=None):
89 | """
90 | Create a docstring entry for a swig interface file.
91 |
92 | obj - a doxyxml object from which documentation will be extracted.
93 | name - the name of the C object (defaults to obj.name())
94 | templ - an optional template for the docstring containing only one
95 | variable named 'description'.
96 | description - if this optional variable is set then it's value is
97 | used as the description instead of extracting it from obj.
98 | """
99 | if name is None:
100 | name=obj.name()
101 | if "operator " in name:
102 | return ''
103 | if description is None:
104 | description = combine_descriptions(obj)
105 | docstring = templ.format(description=description)
106 | if not docstring:
107 | return ''
108 | return entry_templ.format(
109 | name=name,
110 | docstring=docstring,
111 | )
112 |
113 |
114 | def make_func_entry(func, name=None, description=None, params=None):
115 | """
116 | Create a function docstring entry for a swig interface file.
117 |
118 | func - a doxyxml object from which documentation will be extracted.
119 | name - the name of the C object (defaults to func.name())
120 | description - if this optional variable is set then it's value is
121 | used as the description instead of extracting it from func.
122 | params - a parameter list that overrides using func.params.
123 | """
124 | if params is None:
125 | params = func.params
126 | params = [prm.declname for prm in params]
127 | if params:
128 | sig = "Params: (%s)" % ", ".join(params)
129 | else:
130 | sig = "Params: (NONE)"
131 | templ = "{description}\n\n" + sig
132 | return make_entry(func, name=name, templ=utoascii(templ),
133 | description=description)
134 |
135 |
136 | def make_class_entry(klass, description=None):
137 | """
138 | Create a class docstring for a swig interface file.
139 | """
140 | output = []
141 | output.append(make_entry(klass, description=description))
142 | for func in klass.in_category(DoxyFunction):
143 | name = klass.name() + '::' + func.name()
144 | output.append(make_func_entry(func, name=name))
145 | return "\n\n".join(output)
146 |
147 |
148 | def make_block_entry(di, block):
149 | """
150 | Create class and function docstrings of a gnuradio block for a
151 | swig interface file.
152 | """
153 | descriptions = []
154 | # Get the documentation associated with the class.
155 | class_desc = combine_descriptions(block)
156 | if class_desc:
157 | descriptions.append(class_desc)
158 | # Get the documentation associated with the make function
159 | make_func = di.get_member(make_name(block.name()), DoxyFunction)
160 | make_func_desc = combine_descriptions(make_func)
161 | if make_func_desc:
162 | descriptions.append(make_func_desc)
163 | # Get the documentation associated with the file
164 | try:
165 | block_file = di.get_member(block.name() + ".h", DoxyFile)
166 | file_desc = combine_descriptions(block_file)
167 | if file_desc:
168 | descriptions.append(file_desc)
169 | except base.Base.NoSuchMember:
170 | # Don't worry if we can't find a matching file.
171 | pass
172 | # And join them all together to make a super duper description.
173 | super_description = "\n\n".join(descriptions)
174 | # Associate the combined description with the class and
175 | # the make function.
176 | output = []
177 | output.append(make_class_entry(block, description=super_description))
178 | creator = block.get_member(block.name(), DoxyFunction)
179 | output.append(make_func_entry(make_func, description=super_description,
180 | params=creator.params))
181 | return "\n\n".join(output)
182 |
183 |
184 | def make_swig_interface_file(di, swigdocfilename, custom_output=None):
185 |
186 | output = ["""
187 | /*
188 | * This file was automatically generated using swig_doc.py.
189 | *
190 | * Any changes to it will be lost next time it is regenerated.
191 | */
192 | """]
193 |
194 | if custom_output is not None:
195 | output.append(custom_output)
196 |
197 | # Create docstrings for the blocks.
198 | blocks = di.in_category(Block)
199 | make_funcs = set([])
200 | for block in blocks:
201 | try:
202 | make_func = di.get_member(make_name(block.name()), DoxyFunction)
203 | make_funcs.add(make_func.name())
204 | output.append(make_block_entry(di, block))
205 | except block.ParsingError:
206 | print('Parsing error for block %s' % block.name())
207 |
208 | # Create docstrings for functions
209 | # Don't include the make functions since they have already been dealt with.
210 | funcs = [f for f in di.in_category(DoxyFunction) if f.name() not in make_funcs]
211 | for f in funcs:
212 | try:
213 | output.append(make_func_entry(f))
214 | except f.ParsingError:
215 | print('Parsing error for function %s' % f.name())
216 |
217 | # Create docstrings for classes
218 | block_names = [block.name() for block in blocks]
219 | klasses = [k for k in di.in_category(DoxyClass) if k.name() not in block_names]
220 | for k in klasses:
221 | try:
222 | output.append(make_class_entry(k))
223 | except k.ParsingError:
224 | print('Parsing error for class %s' % k.name())
225 |
226 | # Docstrings are not created for anything that is not a function or a class.
227 | # If this excludes anything important please add it here.
228 |
229 | output = "\n\n".join(output)
230 |
231 | swig_doc = file(swigdocfilename, 'w')
232 | swig_doc.write(output)
233 | swig_doc.close()
234 |
235 | if __name__ == "__main__":
236 | # Parse command line options and set up doxyxml.
237 | err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
238 | if len(sys.argv) != 3:
239 | raise StandardError(err_msg)
240 | xml_path = sys.argv[1]
241 | swigdocfilename = sys.argv[2]
242 | di = DoxyIndex(xml_path)
243 |
244 | # gnuradio.gr.msq_queue.insert_tail and delete_head create errors unless docstrings are defined!
245 | # This is presumably a bug in SWIG.
246 | #msg_q = di.get_member(u'gr_msg_queue', DoxyClass)
247 | #insert_tail = msg_q.get_member(u'insert_tail', DoxyFunction)
248 | #delete_head = msg_q.get_member(u'delete_head', DoxyFunction)
249 | output = []
250 | #output.append(make_func_entry(insert_tail, name='gr_py_msg_queue__insert_tail'))
251 | #output.append(make_func_entry(delete_head, name='gr_py_msg_queue__delete_head'))
252 | custom_output = "\n\n".join(output)
253 |
254 | # Generate the docstrings interface file.
255 | make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
256 |
--------------------------------------------------------------------------------
/cmake/Modules/GrPython.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_PYTHON_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Setup the python interpreter:
27 | # This allows the user to specify a specific interpreter,
28 | # or finds the interpreter via the built-in cmake module.
29 | ########################################################################
30 | #this allows the user to override PYTHON_EXECUTABLE
31 | if(PYTHON_EXECUTABLE)
32 |
33 | set(PYTHONINTERP_FOUND TRUE)
34 |
35 | #otherwise if not set, try to automatically find it
36 | else(PYTHON_EXECUTABLE)
37 |
38 | #use the built-in find script
39 | find_package(PythonInterp 2)
40 |
41 | #and if that fails use the find program routine
42 | if(NOT PYTHONINTERP_FOUND)
43 | find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5)
44 | if(PYTHON_EXECUTABLE)
45 | set(PYTHONINTERP_FOUND TRUE)
46 | endif(PYTHON_EXECUTABLE)
47 | endif(NOT PYTHONINTERP_FOUND)
48 |
49 | endif(PYTHON_EXECUTABLE)
50 |
51 | if (CMAKE_CROSSCOMPILING)
52 | set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
53 | else (CMAKE_CROSSCOMPILING)
54 | set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
55 | endif(CMAKE_CROSSCOMPILING)
56 |
57 | #make the path to the executable appear in the cmake gui
58 | set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
59 | set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
60 |
61 | #make sure we can use -B with python (introduced in 2.6)
62 | if(PYTHON_EXECUTABLE)
63 | execute_process(
64 | COMMAND ${PYTHON_EXECUTABLE} -B -c ""
65 | OUTPUT_QUIET ERROR_QUIET
66 | RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
67 | )
68 | if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
69 | set(PYTHON_DASH_B "-B")
70 | endif()
71 | endif(PYTHON_EXECUTABLE)
72 |
73 | ########################################################################
74 | # Check for the existence of a python module:
75 | # - desc a string description of the check
76 | # - mod the name of the module to import
77 | # - cmd an additional command to run
78 | # - have the result variable to set
79 | ########################################################################
80 | macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
81 | message(STATUS "")
82 | message(STATUS "Python checking for ${desc}")
83 | execute_process(
84 | COMMAND ${PYTHON_EXECUTABLE} -c "
85 | #########################################
86 | try:
87 | import ${mod}
88 | assert ${cmd}
89 | except ImportError, AssertionError: exit(-1)
90 | except: pass
91 | #########################################"
92 | RESULT_VARIABLE ${have}
93 | )
94 | if(${have} EQUAL 0)
95 | message(STATUS "Python checking for ${desc} - found")
96 | set(${have} TRUE)
97 | else(${have} EQUAL 0)
98 | message(STATUS "Python checking for ${desc} - not found")
99 | set(${have} FALSE)
100 | endif(${have} EQUAL 0)
101 | endmacro(GR_PYTHON_CHECK_MODULE)
102 |
103 | ########################################################################
104 | # Sets the python installation directory GR_PYTHON_DIR
105 | ########################################################################
106 | if(NOT DEFINED GR_PYTHON_DIR)
107 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
108 | from distutils import sysconfig
109 | print sysconfig.get_python_lib(plat_specific=True, prefix='')
110 | " OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
111 | )
112 | endif()
113 | file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
114 |
115 | ########################################################################
116 | # Create an always-built target with a unique name
117 | # Usage: GR_UNIQUE_TARGET( )
118 | ########################################################################
119 | function(GR_UNIQUE_TARGET desc)
120 | file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
121 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
122 | unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
123 | print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
124 | OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
125 | add_custom_target(${_target} ALL DEPENDS ${ARGN})
126 | endfunction(GR_UNIQUE_TARGET)
127 |
128 | ########################################################################
129 | # Install python sources (also builds and installs byte-compiled python)
130 | ########################################################################
131 | function(GR_PYTHON_INSTALL)
132 | include(CMakeParseArgumentsCopy)
133 | CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
134 |
135 | ####################################################################
136 | if(GR_PYTHON_INSTALL_FILES)
137 | ####################################################################
138 | install(${ARGN}) #installs regular python files
139 |
140 | #create a list of all generated files
141 | unset(pysrcfiles)
142 | unset(pycfiles)
143 | unset(pyofiles)
144 | foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
145 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
146 | list(APPEND pysrcfiles ${pyfile})
147 |
148 | #determine if this file is in the source or binary directory
149 | file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
150 | string(LENGTH "${source_rel_path}" source_rel_path_len)
151 | file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
152 | string(LENGTH "${binary_rel_path}" binary_rel_path_len)
153 |
154 | #and set the generated path appropriately
155 | if(${source_rel_path_len} GREATER ${binary_rel_path_len})
156 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
157 | else()
158 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
159 | endif()
160 | list(APPEND pycfiles ${pygenfile}c)
161 | list(APPEND pyofiles ${pygenfile}o)
162 |
163 | #ensure generation path exists
164 | get_filename_component(pygen_path ${pygenfile} PATH)
165 | file(MAKE_DIRECTORY ${pygen_path})
166 |
167 | endforeach(pyfile)
168 |
169 | #the command to generate the pyc files
170 | add_custom_command(
171 | DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
172 | COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
173 | )
174 |
175 | #the command to generate the pyo files
176 | add_custom_command(
177 | DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
178 | COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
179 | )
180 |
181 | #create install rule and add generated files to target list
182 | set(python_install_gen_targets ${pycfiles} ${pyofiles})
183 | install(FILES ${python_install_gen_targets}
184 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
185 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
186 | )
187 |
188 | ####################################################################
189 | elseif(GR_PYTHON_INSTALL_PROGRAMS)
190 | ####################################################################
191 | file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
192 |
193 | if (CMAKE_CROSSCOMPILING)
194 | set(pyexe_native "/usr/bin/env python")
195 | endif()
196 |
197 | foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
198 | get_filename_component(pyfile_name ${pyfile} NAME)
199 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
200 | string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
201 | list(APPEND python_install_gen_targets ${pyexefile})
202 |
203 | get_filename_component(pyexefile_path ${pyexefile} PATH)
204 | file(MAKE_DIRECTORY ${pyexefile_path})
205 |
206 | add_custom_command(
207 | OUTPUT ${pyexefile} DEPENDS ${pyfile}
208 | COMMAND ${PYTHON_EXECUTABLE} -c
209 | "import re; R=re.compile('^\#!.*$\\n',flags=re.MULTILINE); open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+R.sub('',open('${pyfile}','r').read()))"
210 | COMMENT "Shebangin ${pyfile_name}"
211 | VERBATIM
212 | )
213 |
214 | #on windows, python files need an extension to execute
215 | get_filename_component(pyfile_ext ${pyfile} EXT)
216 | if(WIN32 AND NOT pyfile_ext)
217 | set(pyfile_name "${pyfile_name}.py")
218 | endif()
219 |
220 | install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
221 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
222 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
223 | )
224 | endforeach(pyfile)
225 |
226 | endif()
227 |
228 | GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
229 |
230 | endfunction(GR_PYTHON_INSTALL)
231 |
232 | ########################################################################
233 | # Write the python helper script that generates byte code files
234 | ########################################################################
235 | file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
236 | import sys, py_compile
237 | files = sys.argv[1:]
238 | srcs, gens = files[:len(files)/2], files[len(files)/2:]
239 | for src, gen in zip(srcs, gens):
240 | py_compile.compile(file=src, cfile=gen, doraise=True)
241 | ")
242 |
--------------------------------------------------------------------------------
/cmake/Modules/GrSwig.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_SWIG_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_SWIG_CMAKE TRUE)
24 |
25 | include(GrPython)
26 |
27 | ########################################################################
28 | # Builds a swig documentation file to be generated into python docstrings
29 | # Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
30 | #
31 | # Set the following variable to specify extra dependent targets:
32 | # - GR_SWIG_DOCS_SOURCE_DEPS
33 | # - GR_SWIG_DOCS_TARGET_DEPS
34 | ########################################################################
35 | function(GR_SWIG_MAKE_DOCS output_file)
36 | if(ENABLE_DOXYGEN)
37 |
38 | #setup the input files variable list, quote formated
39 | set(input_files)
40 | unset(INPUT_PATHS)
41 | foreach(input_path ${ARGN})
42 | if(IS_DIRECTORY ${input_path}) #when input path is a directory
43 | file(GLOB input_path_h_files ${input_path}/*.h)
44 | else() #otherwise its just a file, no glob
45 | set(input_path_h_files ${input_path})
46 | endif()
47 | list(APPEND input_files ${input_path_h_files})
48 | set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
49 | endforeach(input_path)
50 |
51 | #determine the output directory
52 | get_filename_component(name ${output_file} NAME_WE)
53 | get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
54 | set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
55 | make_directory(${OUTPUT_DIRECTORY})
56 |
57 | #generate the Doxyfile used by doxygen
58 | configure_file(
59 | ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
60 | ${OUTPUT_DIRECTORY}/Doxyfile
61 | @ONLY)
62 |
63 | #Create a dummy custom command that depends on other targets
64 | include(GrMiscUtils)
65 | GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
66 |
67 | #call doxygen on the Doxyfile + input headers
68 | add_custom_command(
69 | OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
70 | DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
71 | COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
72 | COMMENT "Generating doxygen xml for ${name} docs"
73 | )
74 |
75 | #call the swig_doc script on the xml files
76 | add_custom_command(
77 | OUTPUT ${output_file}
78 | DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
79 | COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
80 | ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
81 | ${OUTPUT_DIRECTORY}/xml
82 | ${output_file}
83 | COMMENT "Generating python docstrings for ${name}"
84 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
85 | )
86 |
87 | else(ENABLE_DOXYGEN)
88 | file(WRITE ${output_file} "\n") #no doxygen -> empty file
89 | endif(ENABLE_DOXYGEN)
90 | endfunction(GR_SWIG_MAKE_DOCS)
91 |
92 | ########################################################################
93 | # Build a swig target for the common gnuradio use case. Usage:
94 | # GR_SWIG_MAKE(target ifile ifile ifile...)
95 | #
96 | # Set the following variables before calling:
97 | # - GR_SWIG_FLAGS
98 | # - GR_SWIG_INCLUDE_DIRS
99 | # - GR_SWIG_LIBRARIES
100 | # - GR_SWIG_SOURCE_DEPS
101 | # - GR_SWIG_TARGET_DEPS
102 | # - GR_SWIG_DOC_FILE
103 | # - GR_SWIG_DOC_DIRS
104 | ########################################################################
105 | macro(GR_SWIG_MAKE name)
106 | set(ifiles ${ARGN})
107 |
108 | # Shimming this in here to take care of a SWIG bug with handling
109 | # vector and vector (on 32-bit machines) and
110 | # vector (on 64-bit machines). Use this to test
111 | # the size of size_t, then set SIZE_T_32 if it's a 32-bit machine
112 | # or not if it's 64-bit. The logic in gr_type.i handles the rest.
113 | INCLUDE(CheckTypeSize)
114 | CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
115 | CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
116 | if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
117 | list(APPEND GR_SWIG_FLAGS -DSIZE_T_32)
118 | endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
119 |
120 | #do swig doc generation if specified
121 | if(GR_SWIG_DOC_FILE)
122 | set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
123 | list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS})
124 | GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
125 | add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE})
126 | list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE})
127 | endif()
128 |
129 | #append additional include directories
130 | find_package(PythonLibs 2)
131 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
132 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
133 |
134 | #prepend local swig directories
135 | list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR})
136 | list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR})
137 |
138 | #determine include dependencies for swig file
139 | execute_process(
140 | COMMAND ${PYTHON_EXECUTABLE}
141 | ${CMAKE_BINARY_DIR}/get_swig_deps.py
142 | "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
143 | OUTPUT_STRIP_TRAILING_WHITESPACE
144 | OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
145 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
146 | )
147 |
148 | #Create a dummy custom command that depends on other targets
149 | include(GrMiscUtils)
150 | GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
151 | set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
152 | add_custom_command(
153 | OUTPUT ${tag_file}
154 | DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
155 | COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
156 | )
157 |
158 | #append the specified include directories
159 | include_directories(${GR_SWIG_INCLUDE_DIRS})
160 | list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
161 |
162 | #setup the swig flags with flags and include directories
163 | set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
164 | foreach(dir ${GR_SWIG_INCLUDE_DIRS})
165 | list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
166 | endforeach(dir)
167 |
168 | #set the C++ property on the swig .i file so it builds
169 | set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
170 |
171 | #setup the actual swig library target to be built
172 | include(UseSWIG)
173 | SWIG_ADD_MODULE(${name} python ${ifiles})
174 | SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES})
175 | if(${name} STREQUAL "runtime_swig")
176 | SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS")
177 | endif(${name} STREQUAL "runtime_swig")
178 |
179 | endmacro(GR_SWIG_MAKE)
180 |
181 | ########################################################################
182 | # Install swig targets generated by GR_SWIG_MAKE. Usage:
183 | # GR_SWIG_INSTALL(
184 | # TARGETS target target target...
185 | # [DESTINATION destination]
186 | # [COMPONENT component]
187 | # )
188 | ########################################################################
189 | macro(GR_SWIG_INSTALL)
190 |
191 | include(CMakeParseArgumentsCopy)
192 | CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
193 |
194 | foreach(name ${GR_SWIG_INSTALL_TARGETS})
195 | install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
196 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
197 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
198 | )
199 |
200 | include(GrPython)
201 | GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
202 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
203 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
204 | )
205 |
206 | GR_LIBTOOL(
207 | TARGET ${SWIG_MODULE_${name}_REAL_NAME}
208 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
209 | )
210 |
211 | endforeach(name)
212 |
213 | endmacro(GR_SWIG_INSTALL)
214 |
215 | ########################################################################
216 | # Generate a python file that can determine swig dependencies.
217 | # Used by the make macro above to determine extra dependencies.
218 | # When you build C++, CMake figures out the header dependencies.
219 | # This code essentially performs that logic for swig includes.
220 | ########################################################################
221 | file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
222 |
223 | import os, sys, re
224 |
225 | i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]')
226 | h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]')
227 | include_dirs = sys.argv[2].split(';')
228 |
229 | def get_swig_incs(file_path):
230 | if file_path.endswith('.i'): matcher = i_include_matcher
231 | else: matcher = h_include_matcher
232 | file_contents = open(file_path, 'r').read()
233 | return matcher.findall(file_contents, re.MULTILINE)
234 |
235 | def get_swig_deps(file_path, level):
236 | deps = [file_path]
237 | if level == 0: return deps
238 | for keyword, inc_file in get_swig_incs(file_path):
239 | for inc_dir in include_dirs:
240 | inc_path = os.path.join(inc_dir, inc_file)
241 | if not os.path.exists(inc_path): continue
242 | deps.extend(get_swig_deps(inc_path, level-1))
243 | break #found, we dont search in lower prio inc dirs
244 | return deps
245 |
246 | if __name__ == '__main__':
247 | ifiles = sys.argv[1].split(';')
248 | deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
249 | #sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
250 | print(';'.join(set(deps)))
251 | ")
252 |
--------------------------------------------------------------------------------
/cmake/Modules/UseSWIG.cmake:
--------------------------------------------------------------------------------
1 | # - SWIG module for CMake
2 | # Defines the following macros:
3 | # SWIG_ADD_MODULE(name language [ files ])
4 | # - Define swig module with given name and specified language
5 | # SWIG_LINK_LIBRARIES(name [ libraries ])
6 | # - Link libraries to swig module
7 | # All other macros are for internal use only.
8 | # To get the actual name of the swig module,
9 | # use: ${SWIG_MODULE_${name}_REAL_NAME}.
10 | # Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
11 | # special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
12 | # special flags to all swig calls.
13 | # Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
14 | # where to write all the swig generated module (swig -outdir option)
15 | # The name-specific variable SWIG_MODULE__EXTRA_DEPS may be used
16 | # to specify extra dependencies for the generated modules.
17 | # If the source file generated by swig need some special flag you can use
18 | # set_source_files_properties( ${swig_generated_file_fullname}
19 | # PROPERTIES COMPILE_FLAGS "-bla")
20 |
21 |
22 | #=============================================================================
23 | # Copyright 2004-2009 Kitware, Inc.
24 | # Copyright 2009 Mathieu Malaterre
25 | #
26 | # Distributed under the OSI-approved BSD License (the "License");
27 | # see accompanying file Copyright.txt for details.
28 | #
29 | # This software is distributed WITHOUT ANY WARRANTY; without even the
30 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
31 | # See the License for more information.
32 | #=============================================================================
33 | # (To distribute this file outside of CMake, substitute the full
34 | # License text for the above reference.)
35 |
36 | set(SWIG_CXX_EXTENSION "cxx")
37 | set(SWIG_EXTRA_LIBRARIES "")
38 |
39 | set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
40 |
41 | #
42 | # For given swig module initialize variables associated with it
43 | #
44 | macro(SWIG_MODULE_INITIALIZE name language)
45 | string(TOUPPER "${language}" swig_uppercase_language)
46 | string(TOLOWER "${language}" swig_lowercase_language)
47 | set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
48 | set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
49 |
50 | set(SWIG_MODULE_${name}_REAL_NAME "${name}")
51 | if("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "UNKNOWN")
52 | message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
53 | elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PYTHON")
54 | # when swig is used without the -interface it will produce in the module.py
55 | # a 'import _modulename' statement, which implies having a corresponding
56 | # _modulename.so (*NIX), _modulename.pyd (Win32).
57 | set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
58 | elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PERL")
59 | set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
60 | endif()
61 | endmacro()
62 |
63 | #
64 | # For a given language, input file, and output file, determine extra files that
65 | # will be generated. This is internal swig macro.
66 | #
67 |
68 | macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
69 | set(${outfiles} "")
70 | get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
71 | ${infile} SWIG_MODULE_NAME)
72 | if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
73 | get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
74 | endif()
75 | foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
76 | set(${outfiles} ${${outfiles}}
77 | "${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
78 | endforeach()
79 | endmacro()
80 |
81 | #
82 | # Take swig (*.i) file and add proper custom commands for it
83 | #
84 | macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
85 | set(swig_full_infile ${infile})
86 | get_filename_component(swig_source_file_path "${infile}" PATH)
87 | get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
88 | get_source_file_property(swig_source_file_generated ${infile} GENERATED)
89 | get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
90 | get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
91 | if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
92 | set(swig_source_file_flags "")
93 | endif()
94 | set(swig_source_file_fullname "${infile}")
95 | if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
96 | string(REGEX REPLACE
97 | "^${CMAKE_CURRENT_SOURCE_DIR}" ""
98 | swig_source_file_relative_path
99 | "${swig_source_file_path}")
100 | else()
101 | if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
102 | string(REGEX REPLACE
103 | "^${CMAKE_CURRENT_BINARY_DIR}" ""
104 | swig_source_file_relative_path
105 | "${swig_source_file_path}")
106 | set(swig_source_file_generated 1)
107 | else()
108 | set(swig_source_file_relative_path "${swig_source_file_path}")
109 | if(swig_source_file_generated)
110 | set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
111 | else()
112 | set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
113 | endif()
114 | endif()
115 | endif()
116 |
117 | set(swig_generated_file_fullname
118 | "${CMAKE_CURRENT_BINARY_DIR}")
119 | if(swig_source_file_relative_path)
120 | set(swig_generated_file_fullname
121 | "${swig_generated_file_fullname}/${swig_source_file_relative_path}")
122 | endif()
123 | # If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
124 | if(CMAKE_SWIG_OUTDIR)
125 | set(swig_outdir ${CMAKE_SWIG_OUTDIR})
126 | else()
127 | set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
128 | endif()
129 | SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
130 | swig_extra_generated_files
131 | "${swig_outdir}"
132 | "${infile}")
133 | set(swig_generated_file_fullname
134 | "${swig_generated_file_fullname}/${swig_source_file_name_we}")
135 | # add the language into the name of the file (i.e. TCL_wrap)
136 | # this allows for the same .i file to be wrapped into different languages
137 | set(swig_generated_file_fullname
138 | "${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
139 |
140 | if(swig_source_file_cplusplus)
141 | set(swig_generated_file_fullname
142 | "${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
143 | else()
144 | set(swig_generated_file_fullname
145 | "${swig_generated_file_fullname}.c")
146 | endif()
147 |
148 | # Shut up some warnings from poor SWIG code generation that we
149 | # can do nothing about, when this flag is available
150 | include(CheckCXXCompilerFlag)
151 | check_cxx_compiler_flag("-Wno-unused-but-set-variable" HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
152 | if(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
153 | set_source_files_properties(${swig_generated_file_fullname}
154 | PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
155 | endif(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
156 |
157 | get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
158 | set(swig_include_dirs)
159 | foreach(it ${cmake_include_directories})
160 | set(swig_include_dirs ${swig_include_dirs} "-I${it}")
161 | endforeach()
162 |
163 | set(swig_special_flags)
164 | # default is c, so add c++ flag if it is c++
165 | if(swig_source_file_cplusplus)
166 | set(swig_special_flags ${swig_special_flags} "-c++")
167 | endif()
168 | set(swig_extra_flags)
169 | if(SWIG_MODULE_${name}_EXTRA_FLAGS)
170 | set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
171 | endif()
172 |
173 | # hack to work around CMake bug in add_custom_command with multiple OUTPUT files
174 |
175 | file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
176 | execute_process(
177 | COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
178 | unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
179 | print(re.sub('\\W', '_', '${name} ${reldir} ' + unique))"
180 | OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE
181 | )
182 |
183 | file(
184 | WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
185 | "int main(void){return 0;}\n"
186 | )
187 |
188 | # create dummy dependencies
189 | add_custom_command(
190 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
191 | COMMAND ${CMAKE_COMMAND} -E copy
192 | ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
193 | ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
194 | DEPENDS "${swig_source_file_fullname}" ${SWIG_MODULE_${name}_EXTRA_DEPS}
195 | COMMENT ""
196 | )
197 |
198 | # create the dummy target
199 | add_executable(${_target} ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp)
200 |
201 | # add a custom command to the dummy target
202 | add_custom_command(
203 | TARGET ${_target}
204 | # Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
205 | COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
206 | COMMAND "${SWIG_EXECUTABLE}"
207 | ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
208 | ${swig_source_file_flags}
209 | ${CMAKE_SWIG_FLAGS}
210 | -outdir ${swig_outdir}
211 | ${swig_special_flags}
212 | ${swig_extra_flags}
213 | ${swig_include_dirs}
214 | -o "${swig_generated_file_fullname}"
215 | "${swig_source_file_fullname}"
216 | COMMENT "Swig source"
217 | )
218 |
219 | #add dummy independent dependencies from the _target to each file
220 | #that will be generated by the SWIG command above
221 |
222 | set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
223 |
224 | foreach(swig_gen_file ${${outfiles}})
225 | add_custom_command(
226 | OUTPUT ${swig_gen_file}
227 | COMMAND ""
228 | DEPENDS ${_target}
229 | COMMENT ""
230 | )
231 | endforeach()
232 |
233 | set_source_files_properties(
234 | ${outfiles} PROPERTIES GENERATED 1
235 | )
236 |
237 | endmacro()
238 |
239 | #
240 | # Create Swig module
241 | #
242 | macro(SWIG_ADD_MODULE name language)
243 | SWIG_MODULE_INITIALIZE(${name} ${language})
244 | set(swig_dot_i_sources)
245 | set(swig_other_sources)
246 | foreach(it ${ARGN})
247 | if(${it} MATCHES ".*\\.i$")
248 | set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
249 | else()
250 | set(swig_other_sources ${swig_other_sources} "${it}")
251 | endif()
252 | endforeach()
253 |
254 | set(swig_generated_sources)
255 | foreach(it ${swig_dot_i_sources})
256 | SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
257 | set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
258 | endforeach()
259 | get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
260 | set_directory_properties(PROPERTIES
261 | ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
262 | add_library(${SWIG_MODULE_${name}_REAL_NAME}
263 | MODULE
264 | ${swig_generated_sources}
265 | ${swig_other_sources})
266 | string(TOLOWER "${language}" swig_lowercase_language)
267 | if ("${swig_lowercase_language}" STREQUAL "java")
268 | if (APPLE)
269 | # In java you want:
270 | # System.loadLibrary("LIBRARY");
271 | # then JNI will look for a library whose name is platform dependent, namely
272 | # MacOS : libLIBRARY.jnilib
273 | # Windows: LIBRARY.dll
274 | # Linux : libLIBRARY.so
275 | set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
276 | endif ()
277 | endif ()
278 | if ("${swig_lowercase_language}" STREQUAL "python")
279 | # this is only needed for the python case where a _modulename.so is generated
280 | set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
281 | # Python extension modules on Windows must have the extension ".pyd"
282 | # instead of ".dll" as of Python 2.5. Older python versions do support
283 | # this suffix.
284 | # http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
285 | #
286 | # Windows: .dll is no longer supported as a filename extension for extension modules.
287 | # .pyd is now the only filename extension that will be searched for.
288 | #
289 | if(WIN32 AND NOT CYGWIN)
290 | set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
291 | endif()
292 | endif ()
293 | endmacro()
294 |
295 | #
296 | # Like TARGET_LINK_LIBRARIES but for swig modules
297 | #
298 | macro(SWIG_LINK_LIBRARIES name)
299 | if(SWIG_MODULE_${name}_REAL_NAME)
300 | target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
301 | else()
302 | message(SEND_ERROR "Cannot find Swig library \"${name}\".")
303 | endif()
304 | endmacro()
305 |
--------------------------------------------------------------------------------
/examples/Static_Channel_Test.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Wed Jul 6 14:34:08 2016
5 |
6 | options
7 |
8 | author
9 | Michael Rahaim
10 |
11 |
12 | window_size
13 |
14 |
15 |
16 | category
17 | Custom
18 |
19 |
20 | comment
21 |
22 |
23 |
24 | description
25 | Shows the recieved sine wave after passing through the simulated VLC channel with specified emission angle, acceptance angle, and distance.
26 |
27 |
28 | _enabled
29 | True
30 |
31 |
32 | _coordinate
33 | (8, 8)
34 |
35 |
36 | _rotation
37 | 0
38 |
39 |
40 | generate_options
41 | qt_gui
42 |
43 |
44 | hier_block_src_path
45 | .:
46 |
47 |
48 | id
49 | VLC_static_channel_sim
50 |
51 |
52 | max_nouts
53 | 0
54 |
55 |
56 | qt_qss_theme
57 |
58 |
59 |
60 | realtime_scheduling
61 |
62 |
63 |
64 | run_command
65 | {python} -u {filename}
66 |
67 |
68 | run_options
69 | prompt
70 |
71 |
72 | run
73 | True
74 |
75 |
76 | thread_safe_setters
77 |
78 |
79 |
80 | title
81 | Static VLC Channel Simulation
82 |
83 |
84 |
85 | variable_qtgui_range
86 |
87 | comment
88 |
89 |
90 |
91 | value
92 | 1
93 |
94 |
95 | _enabled
96 | True
97 |
98 |
99 | _coordinate
100 | (8, 203)
101 |
102 |
103 | gui_hint
104 |
105 |
106 |
107 | _rotation
108 | 0
109 |
110 |
111 | id
112 | my_amp
113 |
114 |
115 | label
116 | Amplitude
117 |
118 |
119 | min_len
120 | 200
121 |
122 |
123 | orient
124 | Qt.Horizontal
125 |
126 |
127 | start
128 | 0
129 |
130 |
131 | step
132 | 0.05
133 |
134 |
135 | stop
136 | 1
137 |
138 |
139 | rangeType
140 | float
141 |
142 |
143 | widget
144 | counter_slider
145 |
146 |
147 |
148 | variable
149 |
150 | comment
151 |
152 |
153 |
154 | _enabled
155 | True
156 |
157 |
158 | _coordinate
159 | (8, 131)
160 |
161 |
162 | _rotation
163 | 0
164 |
165 |
166 | id
167 | samp_rate
168 |
169 |
170 | value
171 | 32000
172 |
173 |
174 |
175 | analog_sig_source_x
176 |
177 | amp
178 | my_amp
179 |
180 |
181 | alias
182 |
183 |
184 |
185 | comment
186 |
187 |
188 |
189 | affinity
190 |
191 |
192 |
193 | _enabled
194 | True
195 |
196 |
197 | freq
198 | 1000
199 |
200 |
201 | _coordinate
202 | (208, 51)
203 |
204 |
205 | _rotation
206 | 0
207 |
208 |
209 | id
210 | analog_sig_source_x_0
211 |
212 |
213 | maxoutbuf
214 | 0
215 |
216 |
217 | minoutbuf
218 | 0
219 |
220 |
221 | offset
222 | 0
223 |
224 |
225 | type
226 | float
227 |
228 |
229 | samp_rate
230 | samp_rate
231 |
232 |
233 | waveform
234 | analog.GR_COS_WAVE
235 |
236 |
237 |
238 | blocks_throttle
239 |
240 | alias
241 |
242 |
243 |
244 | comment
245 |
246 |
247 |
248 | affinity
249 |
250 |
251 |
252 | _enabled
253 | True
254 |
255 |
256 | _coordinate
257 | (624, 83)
258 |
259 |
260 | _rotation
261 | 0
262 |
263 |
264 | id
265 | blocks_throttle_0
266 |
267 |
268 | ignoretag
269 | True
270 |
271 |
272 | maxoutbuf
273 | 0
274 |
275 |
276 | minoutbuf
277 | 0
278 |
279 |
280 | samples_per_second
281 | samp_rate
282 |
283 |
284 | type
285 | float
286 |
287 |
288 | vlen
289 | 1
290 |
291 |
292 |
293 | qtgui_time_sink_x
294 |
295 | autoscale
296 | False
297 |
298 |
299 | alias
300 |
301 |
302 |
303 | comment
304 |
305 |
306 |
307 | ctrlpanel
308 | False
309 |
310 |
311 | affinity
312 |
313 |
314 |
315 | entags
316 | True
317 |
318 |
319 | _enabled
320 | True
321 |
322 |
323 | _coordinate
324 | (632, 163)
325 |
326 |
327 | gui_hint
328 |
329 |
330 |
331 | _rotation
332 | 180
333 |
334 |
335 | grid
336 | False
337 |
338 |
339 | id
340 | qtgui_time_sink_x_0
341 |
342 |
343 | legend
344 | True
345 |
346 |
347 | alpha1
348 | 1.0
349 |
350 |
351 | color1
352 | "blue"
353 |
354 |
355 | label1
356 |
357 |
358 |
359 | marker1
360 | -1
361 |
362 |
363 | style1
364 | 1
365 |
366 |
367 | width1
368 | 1
369 |
370 |
371 | alpha10
372 | 1.0
373 |
374 |
375 | color10
376 | "blue"
377 |
378 |
379 | label10
380 |
381 |
382 |
383 | marker10
384 | -1
385 |
386 |
387 | style10
388 | 1
389 |
390 |
391 | width10
392 | 1
393 |
394 |
395 | alpha2
396 | 1.0
397 |
398 |
399 | color2
400 | "red"
401 |
402 |
403 | label2
404 |
405 |
406 |
407 | marker2
408 | -1
409 |
410 |
411 | style2
412 | 1
413 |
414 |
415 | width2
416 | 1
417 |
418 |
419 | alpha3
420 | 1.0
421 |
422 |
423 | color3
424 | "green"
425 |
426 |
427 | label3
428 |
429 |
430 |
431 | marker3
432 | -1
433 |
434 |
435 | style3
436 | 1
437 |
438 |
439 | width3
440 | 1
441 |
442 |
443 | alpha4
444 | 1.0
445 |
446 |
447 | color4
448 | "black"
449 |
450 |
451 | label4
452 |
453 |
454 |
455 | marker4
456 | -1
457 |
458 |
459 | style4
460 | 1
461 |
462 |
463 | width4
464 | 1
465 |
466 |
467 | alpha5
468 | 1.0
469 |
470 |
471 | color5
472 | "cyan"
473 |
474 |
475 | label5
476 |
477 |
478 |
479 | marker5
480 | -1
481 |
482 |
483 | style5
484 | 1
485 |
486 |
487 | width5
488 | 1
489 |
490 |
491 | alpha6
492 | 1.0
493 |
494 |
495 | color6
496 | "magenta"
497 |
498 |
499 | label6
500 |
501 |
502 |
503 | marker6
504 | -1
505 |
506 |
507 | style6
508 | 1
509 |
510 |
511 | width6
512 | 1
513 |
514 |
515 | alpha7
516 | 1.0
517 |
518 |
519 | color7
520 | "yellow"
521 |
522 |
523 | label7
524 |
525 |
526 |
527 | marker7
528 | -1
529 |
530 |
531 | style7
532 | 1
533 |
534 |
535 | width7
536 | 1
537 |
538 |
539 | alpha8
540 | 1.0
541 |
542 |
543 | color8
544 | "dark red"
545 |
546 |
547 | label8
548 |
549 |
550 |
551 | marker8
552 | -1
553 |
554 |
555 | style8
556 | 1
557 |
558 |
559 | width8
560 | 1
561 |
562 |
563 | alpha9
564 | 1.0
565 |
566 |
567 | color9
568 | "dark green"
569 |
570 |
571 | label9
572 |
573 |
574 |
575 | marker9
576 | -1
577 |
578 |
579 | style9
580 | 1
581 |
582 |
583 | width9
584 | 1
585 |
586 |
587 | name
588 | ""
589 |
590 |
591 | nconnections
592 | 1
593 |
594 |
595 | size
596 | 1024
597 |
598 |
599 | srate
600 | samp_rate
601 |
602 |
603 | tr_chan
604 | 0
605 |
606 |
607 | tr_delay
608 | 0
609 |
610 |
611 | tr_level
612 | 0.0
613 |
614 |
615 | tr_mode
616 | qtgui.TRIG_MODE_FREE
617 |
618 |
619 | tr_slope
620 | qtgui.TRIG_SLOPE_POS
621 |
622 |
623 | tr_tag
624 | ""
625 |
626 |
627 | type
628 | float
629 |
630 |
631 | update_time
632 | 0.10
633 |
634 |
635 | ylabel
636 | Amplitude
637 |
638 |
639 | yunit
640 | ""
641 |
642 |
643 | ymax
644 | 1
645 |
646 |
647 | ymin
648 | -1
649 |
650 |
651 |
652 | vlc_channel_static
653 |
654 | acceptance_angle
655 | 25
656 |
657 |
658 | alias
659 |
660 |
661 |
662 | comment
663 |
664 |
665 |
666 | affinity
667 |
668 |
669 |
670 | distance
671 | 2
672 |
673 |
674 | emission_angle
675 | 15
676 |
677 |
678 | _enabled
679 | True
680 |
681 |
682 | _coordinate
683 | (400, 67)
684 |
685 |
686 | _rotation
687 | 0
688 |
689 |
690 | id
691 | vlc_channel_static_0
692 |
693 |
694 | maxoutbuf
695 | 0
696 |
697 |
698 | minoutbuf
699 | 0
700 |
701 |
702 |
703 | analog_sig_source_x_0
704 | vlc_channel_static_0
705 | 0
706 | 0
707 |
708 |
709 | blocks_throttle_0
710 | qtgui_time_sink_x_0
711 | 0
712 | 0
713 |
714 |
715 | vlc_channel_static_0
716 | blocks_throttle_0
717 | 0
718 | 0
719 |
720 |
721 |
--------------------------------------------------------------------------------
/examples/Relative_Channel_Test.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Mon Jul 11 22:30:16 2016
5 |
6 | options
7 |
8 | author
9 | Michael
10 |
11 |
12 | window_size
13 |
14 |
15 |
16 | category
17 | Custom
18 |
19 |
20 | comment
21 |
22 |
23 |
24 | description
25 | Test for VLC channel model with dynamic distance, eission angle, and acceptance angle
26 |
27 |
28 | _enabled
29 | True
30 |
31 |
32 | _coordinate
33 | (8, 8)
34 |
35 |
36 | _rotation
37 | 0
38 |
39 |
40 | generate_options
41 | qt_gui
42 |
43 |
44 | hier_block_src_path
45 | .:
46 |
47 |
48 | id
49 | Relative_Channel_Test
50 |
51 |
52 | max_nouts
53 | 0
54 |
55 |
56 | qt_qss_theme
57 |
58 |
59 |
60 | realtime_scheduling
61 |
62 |
63 |
64 | run_command
65 | {python} -u {filename}
66 |
67 |
68 | run_options
69 | prompt
70 |
71 |
72 | run
73 | True
74 |
75 |
76 | thread_safe_setters
77 |
78 |
79 |
80 | title
81 | Test flow graph for the VLC channel model
82 |
83 |
84 |
85 | variable_qtgui_range
86 |
87 | comment
88 |
89 |
90 |
91 | value
92 | 2
93 |
94 |
95 | _enabled
96 | True
97 |
98 |
99 | _coordinate
100 | (536, 11)
101 |
102 |
103 | gui_hint
104 |
105 |
106 |
107 | _rotation
108 | 0
109 |
110 |
111 | id
112 | my_d
113 |
114 |
115 | label
116 | Distance (m)
117 |
118 |
119 | min_len
120 | 200
121 |
122 |
123 | orient
124 | Qt.Horizontal
125 |
126 |
127 | start
128 | 0
129 |
130 |
131 | step
132 | 0.1
133 |
134 |
135 | stop
136 | 10
137 |
138 |
139 | rangeType
140 | float
141 |
142 |
143 | widget
144 | counter_slider
145 |
146 |
147 |
148 | variable_qtgui_range
149 |
150 | comment
151 |
152 |
153 |
154 | value
155 | 50
156 |
157 |
158 | _enabled
159 | True
160 |
161 |
162 | _coordinate
163 | (184, 11)
164 |
165 |
166 | gui_hint
167 |
168 |
169 |
170 | _rotation
171 | 0
172 |
173 |
174 | id
175 | my_phi
176 |
177 |
178 | label
179 | Emission Angle (deg)
180 |
181 |
182 | min_len
183 | 200
184 |
185 |
186 | orient
187 | Qt.Horizontal
188 |
189 |
190 | start
191 | 0
192 |
193 |
194 | step
195 | 1
196 |
197 |
198 | stop
199 | 90
200 |
201 |
202 | rangeType
203 | float
204 |
205 |
206 | widget
207 | counter_slider
208 |
209 |
210 |
211 | variable_qtgui_range
212 |
213 | comment
214 |
215 |
216 |
217 | value
218 | 50
219 |
220 |
221 | _enabled
222 | True
223 |
224 |
225 | _coordinate
226 | (352, 11)
227 |
228 |
229 | gui_hint
230 |
231 |
232 |
233 | _rotation
234 | 0
235 |
236 |
237 | id
238 | my_psi
239 |
240 |
241 | label
242 | Acceptance Angle (deg)
243 |
244 |
245 | min_len
246 | 200
247 |
248 |
249 | orient
250 | Qt.Horizontal
251 |
252 |
253 | start
254 | 0
255 |
256 |
257 | step
258 | 1
259 |
260 |
261 | stop
262 | 90
263 |
264 |
265 | rangeType
266 | float
267 |
268 |
269 | widget
270 | counter_slider
271 |
272 |
273 |
274 | variable
275 |
276 | comment
277 |
278 |
279 |
280 | _enabled
281 | True
282 |
283 |
284 | _coordinate
285 | (8, 160)
286 |
287 |
288 | _rotation
289 | 0
290 |
291 |
292 | id
293 | samp_rate
294 |
295 |
296 | value
297 | 32000
298 |
299 |
300 |
301 | analog_sig_source_x
302 |
303 | amp
304 | 1
305 |
306 |
307 | alias
308 |
309 |
310 |
311 | comment
312 |
313 |
314 |
315 | affinity
316 |
317 |
318 |
319 | _enabled
320 | True
321 |
322 |
323 | freq
324 | 1000
325 |
326 |
327 | _coordinate
328 | (144, 195)
329 |
330 |
331 | _rotation
332 | 0
333 |
334 |
335 | id
336 | analog_sig_source_x_0
337 |
338 |
339 | maxoutbuf
340 | 0
341 |
342 |
343 | minoutbuf
344 | 0
345 |
346 |
347 | offset
348 | 0
349 |
350 |
351 | type
352 | float
353 |
354 |
355 | samp_rate
356 | samp_rate
357 |
358 |
359 | waveform
360 | analog.GR_COS_WAVE
361 |
362 |
363 |
364 | blocks_throttle
365 |
366 | alias
367 |
368 |
369 |
370 | comment
371 |
372 |
373 |
374 | affinity
375 |
376 |
377 |
378 | _enabled
379 | True
380 |
381 |
382 | _coordinate
383 | (320, 227)
384 |
385 |
386 | _rotation
387 | 0
388 |
389 |
390 | id
391 | blocks_throttle_0
392 |
393 |
394 | ignoretag
395 | True
396 |
397 |
398 | maxoutbuf
399 | 0
400 |
401 |
402 | minoutbuf
403 | 0
404 |
405 |
406 | samples_per_second
407 | samp_rate
408 |
409 |
410 | type
411 | float
412 |
413 |
414 | vlen
415 | 1
416 |
417 |
418 |
419 | qtgui_time_sink_x
420 |
421 | autoscale
422 | True
423 |
424 |
425 | alias
426 |
427 |
428 |
429 | comment
430 |
431 |
432 |
433 | ctrlpanel
434 | False
435 |
436 |
437 | affinity
438 |
439 |
440 |
441 | entags
442 | True
443 |
444 |
445 | _enabled
446 | True
447 |
448 |
449 | _coordinate
450 | (744, 211)
451 |
452 |
453 | gui_hint
454 |
455 |
456 |
457 | _rotation
458 | 0
459 |
460 |
461 | grid
462 | False
463 |
464 |
465 | id
466 | qtgui_time_sink_x_0
467 |
468 |
469 | legend
470 | True
471 |
472 |
473 | alpha1
474 | 1.0
475 |
476 |
477 | color1
478 | "blue"
479 |
480 |
481 | label1
482 |
483 |
484 |
485 | marker1
486 | -1
487 |
488 |
489 | style1
490 | 1
491 |
492 |
493 | width1
494 | 1
495 |
496 |
497 | alpha10
498 | 1.0
499 |
500 |
501 | color10
502 | "blue"
503 |
504 |
505 | label10
506 |
507 |
508 |
509 | marker10
510 | -1
511 |
512 |
513 | style10
514 | 1
515 |
516 |
517 | width10
518 | 1
519 |
520 |
521 | alpha2
522 | 1.0
523 |
524 |
525 | color2
526 | "red"
527 |
528 |
529 | label2
530 |
531 |
532 |
533 | marker2
534 | -1
535 |
536 |
537 | style2
538 | 1
539 |
540 |
541 | width2
542 | 1
543 |
544 |
545 | alpha3
546 | 1.0
547 |
548 |
549 | color3
550 | "green"
551 |
552 |
553 | label3
554 |
555 |
556 |
557 | marker3
558 | -1
559 |
560 |
561 | style3
562 | 1
563 |
564 |
565 | width3
566 | 1
567 |
568 |
569 | alpha4
570 | 1.0
571 |
572 |
573 | color4
574 | "black"
575 |
576 |
577 | label4
578 |
579 |
580 |
581 | marker4
582 | -1
583 |
584 |
585 | style4
586 | 1
587 |
588 |
589 | width4
590 | 1
591 |
592 |
593 | alpha5
594 | 1.0
595 |
596 |
597 | color5
598 | "cyan"
599 |
600 |
601 | label5
602 |
603 |
604 |
605 | marker5
606 | -1
607 |
608 |
609 | style5
610 | 1
611 |
612 |
613 | width5
614 | 1
615 |
616 |
617 | alpha6
618 | 1.0
619 |
620 |
621 | color6
622 | "magenta"
623 |
624 |
625 | label6
626 |
627 |
628 |
629 | marker6
630 | -1
631 |
632 |
633 | style6
634 | 1
635 |
636 |
637 | width6
638 | 1
639 |
640 |
641 | alpha7
642 | 1.0
643 |
644 |
645 | color7
646 | "yellow"
647 |
648 |
649 | label7
650 |
651 |
652 |
653 | marker7
654 | -1
655 |
656 |
657 | style7
658 | 1
659 |
660 |
661 | width7
662 | 1
663 |
664 |
665 | alpha8
666 | 1.0
667 |
668 |
669 | color8
670 | "dark red"
671 |
672 |
673 | label8
674 |
675 |
676 |
677 | marker8
678 | -1
679 |
680 |
681 | style8
682 | 1
683 |
684 |
685 | width8
686 | 1
687 |
688 |
689 | alpha9
690 | 1.0
691 |
692 |
693 | color9
694 | "dark green"
695 |
696 |
697 | label9
698 |
699 |
700 |
701 | marker9
702 | -1
703 |
704 |
705 | style9
706 | 1
707 |
708 |
709 | width9
710 | 1
711 |
712 |
713 | name
714 | ""
715 |
716 |
717 | nconnections
718 | 1
719 |
720 |
721 | size
722 | 1024
723 |
724 |
725 | srate
726 | samp_rate
727 |
728 |
729 | tr_chan
730 | 0
731 |
732 |
733 | tr_delay
734 | 0
735 |
736 |
737 | tr_level
738 | 0.0
739 |
740 |
741 | tr_mode
742 | qtgui.TRIG_MODE_FREE
743 |
744 |
745 | tr_slope
746 | qtgui.TRIG_SLOPE_POS
747 |
748 |
749 | tr_tag
750 | ""
751 |
752 |
753 | type
754 | float
755 |
756 |
757 | update_time
758 | 0.10
759 |
760 |
761 | ylabel
762 | Amplitude
763 |
764 |
765 | yunit
766 | ""
767 |
768 |
769 | ymax
770 | 1
771 |
772 |
773 | ymin
774 | -1
775 |
776 |
777 |
778 | vlc_channel_relative
779 |
780 | psi
781 | my_psi
782 |
783 |
784 | alias
785 |
786 |
787 |
788 | comment
789 |
790 |
791 |
792 | n
793 | 1
794 |
795 |
796 | affinity
797 |
798 |
799 |
800 | d
801 | my_d
802 |
803 |
804 | phi
805 | my_phi
806 |
807 |
808 | _enabled
809 | True
810 |
811 |
812 | Ts
813 | 1
814 |
815 |
816 | _coordinate
817 | (488, 163)
818 |
819 |
820 | _rotation
821 | 0
822 |
823 |
824 | id
825 | vlc_channel_relative_0
826 |
827 |
828 | m
829 | 1
830 |
831 |
832 | maxoutbuf
833 | 0
834 |
835 |
836 | minoutbuf
837 | 0
838 |
839 |
840 | A
841 | 0.001
842 |
843 |
844 | R
845 | 1
846 |
847 |
848 | FOV
849 | 90
850 |
851 |
852 |
853 | analog_sig_source_x_0
854 | blocks_throttle_0
855 | 0
856 | 0
857 |
858 |
859 | blocks_throttle_0
860 | vlc_channel_relative_0
861 | 0
862 | 0
863 |
864 |
865 | vlc_channel_relative_0
866 | qtgui_time_sink_x_0
867 | 0
868 | 0
869 |
870 |
871 |
--------------------------------------------------------------------------------