├── .gitignore
├── README.md
├── docs
├── doxygen
│ ├── other
│ │ ├── group_defs.dox
│ │ └── main_page.dox
│ ├── doxyxml
│ │ ├── generated
│ │ │ ├── __init__.py
│ │ │ ├── index.py
│ │ │ ├── indexsuper.py
│ │ │ └── compound.py
│ │ ├── text.py
│ │ ├── __init__.py
│ │ ├── doxyindex.py
│ │ └── base.py
│ ├── CMakeLists.txt
│ └── swig_doc.py
├── README.dsss
└── CMakeLists.txt
├── swig
├── dsss_swig.i
└── CMakeLists.txt
├── grc
├── dsss_dsss_encoder_bb.xml
├── dsss_dsss_decoder_cc.xml
└── CMakeLists.txt
├── cmake
├── Modules
│ ├── dsssConfig.cmake
│ ├── FindCppUnit.cmake
│ ├── FindGnuradioRuntime.cmake
│ ├── GrPlatform.cmake
│ ├── GrTest.cmake
│ ├── CMakeParseArgumentsCopy.cmake
│ ├── GrMiscUtils.cmake
│ ├── GrSwig.cmake
│ └── GrPython.cmake
└── cmake_uninstall.cmake.in
├── apps
└── CMakeLists.txt
├── include
└── dsss
│ ├── CMakeLists.txt
│ ├── api.h
│ ├── dsss_encoder_bb.h
│ └── dsss_decoder_cc.h
├── lib
├── qa_dsss.cc
├── qa_dsss.h
├── test_dsss.cc
├── dsss_encoder_bb_impl.h
├── dsss_decoder_cc_impl.h
├── CMakeLists.txt
├── dsss_encoder_bb_impl.cc
└── dsss_decoder_cc_impl.cc
├── python
├── build_utils_codes.py
├── qa_dsss_decoder_cc.py
├── CMakeLists.txt
├── __init__.py
├── qa_dsss_encoder_bb.py
└── build_utils.py
├── CMakeLists.txt
└── examples
├── dsss_encoder.grc
└── dsss_decoder2.grc
/.gitignore:
--------------------------------------------------------------------------------
1 | \#*
2 | .\#*
3 | *~
4 | *.pyc
5 | build
6 | examples/top_block.py
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Direct Sequence Spread Spectrum blocks for GNU Radio
2 |
3 | Note: This code is not maintained. A fork with bug fixes can be found at: https://github.com/kantooon/gr-dsss
4 |
--------------------------------------------------------------------------------
/docs/doxygen/other/group_defs.dox:
--------------------------------------------------------------------------------
1 | /*!
2 | * \defgroup block GNU Radio DSSS C++ Signal Processing Blocks
3 | * \brief All C++ blocks that can be used from the DSSS 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 DSSS Block
4 |
5 | This is the intro page for the Doxygen manual generated for the DSSS
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.dsss:
--------------------------------------------------------------------------------
1 | This is the dsss-write-a-block package meant as a guide to building
2 | out-of-tree packages. To use the dsss blocks, the Python namespaces
3 | is in 'dsss', which is imported as:
4 |
5 | import dsss
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(dsss)
12 |
--------------------------------------------------------------------------------
/swig/dsss_swig.i:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 |
3 | #define DSSS_API
4 |
5 | %include "gnuradio.i" // the common stuff
6 |
7 | //load generated python docstrings
8 | %include "dsss_swig_doc.i"
9 |
10 | %{
11 | #include "dsss/dsss_encoder_bb.h"
12 | #include "dsss/dsss_decoder_cc.h"
13 | %}
14 |
15 |
16 | %include "dsss/dsss_encoder_bb.h"
17 | GR_SWIG_BLOCK_MAGIC2(dsss, dsss_encoder_bb);
18 | %include "dsss/dsss_decoder_cc.h"
19 | GR_SWIG_BLOCK_MAGIC2(dsss, dsss_decoder_cc);
20 |
--------------------------------------------------------------------------------
/grc/dsss_dsss_encoder_bb.xml:
--------------------------------------------------------------------------------
1 |
2 | dsss_encoder_bb
3 | dsss_dsss_encoder_bb
4 | dsss
5 | import dsss
6 | dsss.dsss_encoder_bb($code)
7 | set_code($code)
8 |
9 | Code
10 | code
11 | int_vector
12 |
13 |
14 | in
15 | byte
16 |
17 |
18 | out
19 | byte
20 |
21 |
22 |
--------------------------------------------------------------------------------
/grc/dsss_dsss_decoder_cc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | dsss_decoder_cc
4 | dsss_dsss_decoder_cc
5 | dsss
6 | import dsss
7 | dsss.dsss_decoder_cc($code, $samples_per_symbol)
8 | set_code($code)
9 |
10 | Code
11 | code
12 | int_vector
13 |
14 |
15 | Samples per symbol
16 | samples_per_symbol
17 | real
18 |
19 |
20 | in
21 | complex
22 |
23 |
24 | out
25 | complex
26 |
27 |
28 |
--------------------------------------------------------------------------------
/cmake/Modules/dsssConfig.cmake:
--------------------------------------------------------------------------------
1 | INCLUDE(FindPkgConfig)
2 | PKG_CHECK_MODULES(PC_DSSS dsss)
3 |
4 | FIND_PATH(
5 | DSSS_INCLUDE_DIRS
6 | NAMES dsss/api.h
7 | HINTS $ENV{DSSS_DIR}/include
8 | ${PC_DSSS_INCLUDEDIR}
9 | PATHS ${CMAKE_INSTALL_PREFIX}/include
10 | /usr/local/include
11 | /usr/include
12 | )
13 |
14 | FIND_LIBRARY(
15 | DSSS_LIBRARIES
16 | NAMES gnuradio-dsss
17 | HINTS $ENV{DSSS_DIR}/lib
18 | ${PC_DSSS_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(DSSS DEFAULT_MSG DSSS_LIBRARIES DSSS_INCLUDE_DIRS)
29 | MARK_AS_ADVANCED(DSSS_LIBRARIES DSSS_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 | dsss_dsss_encoder_bb.xml
22 | dsss_dsss_decoder_cc.xml DESTINATION share/gnuradio/grc/blocks
23 | )
24 |
--------------------------------------------------------------------------------
/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 | PATHS
19 | /usr/local/include
20 | /usr/include
21 | )
22 |
23 | FIND_LIBRARY(CPPUNIT_LIBRARIES
24 | NAMES cppunit
25 | HINTS ${PC_CPPUNIT_LIBDIR}
26 | PATHS
27 | ${CPPUNIT_INCLUDE_DIRS}/../lib
28 | /usr/local/lib
29 | /usr/lib
30 | )
31 |
32 | LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
33 |
34 | INCLUDE(FindPackageHandleStandardArgs)
35 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
36 | MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
37 |
--------------------------------------------------------------------------------
/include/dsss/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 | dsss_encoder_bb.h
26 | dsss_decoder_cc.h DESTINATION include/dsss
27 | )
28 |
--------------------------------------------------------------------------------
/include/dsss/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_DSSS_API_H
23 | #define INCLUDED_DSSS_API_H
24 |
25 | #include
26 |
27 | #ifdef gnuradio_dsss_EXPORTS
28 | # define DSSS_API __GR_ATTR_EXPORT
29 | #else
30 | # define DSSS_API __GR_ATTR_IMPORT
31 | #endif
32 |
33 | #endif /* INCLUDED_DSSS_API_H */
34 |
--------------------------------------------------------------------------------
/lib/qa_dsss.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_dsss.h"
29 |
30 | CppUnit::TestSuite *
31 | qa_dsss::suite()
32 | {
33 | CppUnit::TestSuite *s = new CppUnit::TestSuite("dsss");
34 |
35 | return s;
36 | }
37 |
--------------------------------------------------------------------------------
/lib/qa_dsss.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_DSSS_H_
24 | #define _QA_DSSS_H_
25 |
26 | #include
27 | #include
28 |
29 | //! collect all the tests for the gr-filter directory
30 |
31 | class __GR_ATTR_EXPORT qa_dsss
32 | {
33 | public:
34 | //! return suite of tests for all of gr-filter directory
35 | static CppUnit::TestSuite *suite();
36 | };
37 |
38 | #endif /* _QA_DSSS_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/test_dsss.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_dsss.h"
32 | #include
33 |
34 | int
35 | main (int argc, char **argv)
36 | {
37 | CppUnit::TextTestRunner runner;
38 | std::ofstream xmlfile(get_unittest_path("dsss.xml").c_str());
39 | CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile);
40 |
41 | runner.addTest(qa_dsss::suite());
42 | runner.setOutputter(xmlout);
43 |
44 | bool was_successful = runner.run("", false);
45 |
46 | return was_successful ? 0 : 1;
47 | }
48 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/python/qa_dsss_decoder_cc.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | #
3 | # Copyright 2013 <+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 | from gnuradio import gr, gr_unittest
22 | from gnuradio import blocks
23 | import dsss_swig as dsss
24 |
25 | class qa_dsss_decoder_cc (gr_unittest.TestCase):
26 |
27 | def setUp (self):
28 | self.tb = gr.top_block ()
29 |
30 | def tearDown (self):
31 | self.tb = None
32 |
33 | def test_001_t (self):
34 | code = ( 157, ) # ( 0b10011100, ) # ( 0b10011100, 0b01000101 ) # code = 01000101 10011100
35 | expected_result = ( 0, )
36 | src_data = ( 0, )
37 | src = blocks.vector_source_c (src_data)
38 | dsss_decoder = dsss.dsss_decoder_cc(code, 2)
39 | dst = blocks.vector_sink_c ()
40 |
41 | self.tb.connect (src, dsss_decoder)
42 | self.tb.connect (dsss_decoder, dst)
43 | self.tb.run ()
44 |
45 | actual_result = dst.data ()
46 |
47 | self.assertEqual(actual_result, expected_result)
48 |
49 | if __name__ == '__main__':
50 | gr_unittest.run(qa_dsss_decoder_cc, "qa_dsss_decoder_cc.xml")
51 |
--------------------------------------------------------------------------------
/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(LINUX AND EXISTS "/etc/debian_version")
33 | set(DEBIAN TRUE)
34 | endif()
35 |
36 | if(LINUX AND EXISTS "/etc/redhat-release")
37 | set(REDHAT TRUE)
38 | endif()
39 |
40 | ########################################################################
41 | # when the library suffix should be 64 (applies to redhat linux family)
42 | ########################################################################
43 | if(NOT DEFINED LIB_SUFFIX AND REDHAT AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
44 | set(LIB_SUFFIX 64)
45 | endif()
46 | set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
47 |
--------------------------------------------------------------------------------
/lib/dsss_encoder_bb_impl.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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_DSSS_DSSS_ENCODER_BB_IMPL_H
22 | #define INCLUDED_DSSS_DSSS_ENCODER_BB_IMPL_H
23 |
24 | #include
25 |
26 | namespace gr {
27 | namespace dsss {
28 |
29 | class dsss_encoder_bb_impl : public dsss_encoder_bb
30 | {
31 | private:
32 | std::vector d_code;
33 |
34 | public:
35 | dsss_encoder_bb_impl(const std::vector &code);
36 | ~dsss_encoder_bb_impl();
37 |
38 | std::vector code() const { return d_code; }
39 | void set_code(const std::vector &code);
40 |
41 | // Where all the action really happens
42 | void forecast (int noutput_items, gr_vector_int &ninput_items_required);
43 |
44 | int general_work(int noutput_items,
45 | gr_vector_int &ninput_items,
46 | gr_vector_const_void_star &input_items,
47 | gr_vector_void_star &output_items);
48 | };
49 |
50 | } // namespace dsss
51 | } // namespace gr
52 |
53 | #endif /* INCLUDED_DSSS_DSSS_ENCODER_BB_IMPL_H */
54 |
55 |
--------------------------------------------------------------------------------
/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}/dsss
35 | )
36 |
37 | ########################################################################
38 | # Handle the unit tests
39 | ########################################################################
40 | include(GrTest)
41 |
42 | set(GR_TEST_TARGET_DEPS gnuradio-dsss)
43 | set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
44 | GR_ADD_TEST(qa_dsss_encoder_bb ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dsss_encoder_bb.py)
45 | GR_ADD_TEST(qa_dsss_decoder_cc ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dsss_decoder_cc.py)
46 |
--------------------------------------------------------------------------------
/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 DSSS module. Place your Python package
23 | description here (python/__init__.py).
24 | '''
25 |
26 | # ----------------------------------------------------------------
27 | # Temporary workaround for ticket:181 (swig+python problem)
28 | import sys
29 | _RTLD_GLOBAL = 0
30 | try:
31 | from dl import RTLD_GLOBAL as _RTLD_GLOBAL
32 | except ImportError:
33 | try:
34 | from DLFCN import RTLD_GLOBAL as _RTLD_GLOBAL
35 | except ImportError:
36 | pass
37 |
38 | if _RTLD_GLOBAL != 0:
39 | _dlopenflags = sys.getdlopenflags()
40 | sys.setdlopenflags(_dlopenflags|_RTLD_GLOBAL)
41 | # ----------------------------------------------------------------
42 |
43 |
44 | # import swig generated symbols into the dsss namespace
45 | from dsss_swig import *
46 |
47 | # import any pure python here
48 | #
49 |
50 | # ----------------------------------------------------------------
51 | # Tail of workaround
52 | if _RTLD_GLOBAL != 0:
53 | sys.setdlopenflags(_dlopenflags) # Restore original flags
54 | # ----------------------------------------------------------------
55 |
--------------------------------------------------------------------------------
/include/dsss/dsss_encoder_bb.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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_DSSS_DSSS_ENCODER_BB_H
23 | #define INCLUDED_DSSS_DSSS_ENCODER_BB_H
24 |
25 | #include
26 | #include
27 |
28 | namespace gr {
29 | namespace dsss {
30 |
31 | /*!
32 | * \brief DSSS Encoder
33 | * \ingroup dsss
34 | *
35 | */
36 | class DSSS_API dsss_encoder_bb : virtual public gr::block
37 | {
38 | public:
39 | typedef boost::shared_ptr sptr;
40 |
41 | /*!
42 | * \brief Return a shared_ptr to a new instance of dsss::dsss_encoder_bb.
43 | *
44 | * To avoid accidental use of raw pointers, dsss::dsss_encoder_bb'so
45 | * constructor is in a private implementation
46 | * class. dsss::dsss_encoder_bb::make is the public interface for
47 | * creating new instances.
48 | */
49 | static sptr make(const std::vector &code);
50 |
51 | virtual std::vector code() const = 0;
52 | virtual void set_code(const std::vector &code) = 0;
53 | };
54 |
55 | } // namespace dsss
56 | } // namespace gr
57 |
58 | #endif /* INCLUDED_DSSS_DSSS_ENCODER_BB_H */
59 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/include/dsss/dsss_decoder_cc.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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_DSSS_DSSS_DECODER_CC_H
23 | #define INCLUDED_DSSS_DSSS_DECODER_CC_H
24 |
25 | #include
26 | #include
27 |
28 | namespace gr {
29 | namespace dsss {
30 |
31 | /*!
32 | * \brief DSSS Decoder
33 | * \ingroup dsss
34 | *
35 | */
36 | class DSSS_API dsss_decoder_cc : virtual public gr::block
37 | {
38 | public:
39 | typedef boost::shared_ptr sptr;
40 |
41 | /*!
42 | * \brief Return a shared_ptr to a new instance of dsss::dsss_decoder_cc.
43 | *
44 | * To avoid accidental use of raw pointers, dsss::dsss_decoder_cc's
45 | * constructor is in a private implementation
46 | * class. dsss::dsss_decoder_cc::make is the public interface for
47 | * creating new instances.
48 | */
49 | static sptr make(const std::vector &code, float samples_per_symbol);
50 |
51 | virtual std::vector code() const = 0;
52 | virtual void set_code(const std::vector &code) = 0;
53 |
54 | virtual std::vector taps() const = 0;
55 | };
56 |
57 | } // namespace dsss
58 | } // namespace gr
59 |
60 | #endif /* INCLUDED_DSSS_DSSS_DECODER_CC_H */
61 |
--------------------------------------------------------------------------------
/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/dsss_decoder_cc_impl.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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_DSSS_DSSS_DECODER_CC_IMPL_H
22 | #define INCLUDED_DSSS_DSSS_DECODER_CC_IMPL_H
23 |
24 | #include
25 |
26 | #include
27 | #include
28 |
29 | namespace gr {
30 | namespace dsss {
31 |
32 | class dsss_decoder_cc_impl : public dsss_decoder_cc
33 | {
34 | private:
35 | std::vector d_code;
36 | std::vector d_taps;
37 | float d_samples_per_symbol;
38 | filter::kernel::fir_filter_ccf* d_match_filter;
39 |
40 | public:
41 | dsss_decoder_cc_impl(const std::vector &code, float samples_per_symbol);
42 | ~dsss_decoder_cc_impl();
43 |
44 | std::vector code() const { return d_code; }
45 | void set_code(const std::vector &code);
46 |
47 | std::vector taps() const {return d_taps;}
48 |
49 | // Where all the action really happens
50 | void forecast (int noutput_items, gr_vector_int &ninput_items_required);
51 |
52 | int general_work(int noutput_items,
53 | gr_vector_int &ninput_items,
54 | gr_vector_const_void_star &input_items,
55 | gr_vector_void_star &output_items);
56 | };
57 |
58 | } // namespace dsss
59 | } // namespace gr
60 |
61 | #endif /* INCLUDED_DSSS_DSSS_DECODER_CC_IMPL_H */
62 |
--------------------------------------------------------------------------------
/python/qa_dsss_encoder_bb.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | #
3 | # Copyright 2013 <+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 | import time
22 | import random
23 |
24 | from gnuradio import gr, gr_unittest
25 | from gnuradio import blocks
26 | import dsss_swig as dsss
27 |
28 | def py_encode(data, code):
29 | out = []
30 | for d in data:
31 | for c in code:
32 | out.append(d ^ c)
33 | return out
34 |
35 | class qa_dsss_encoder_bb (gr_unittest.TestCase):
36 |
37 | def setUp (self):
38 | self.tb = gr.top_block ()
39 |
40 | def tearDown (self):
41 | self.tb = None
42 |
43 | def test_001_dsss_encoder_bb (self):
44 | code_length = 21
45 | code = [random.randint(0, 1) for u in xrange(code_length)]
46 | data_length = 164
47 | data = [random.randint(0, 1) for u in xrange(data_length)]
48 | expected_result = py_encode(data, code)
49 | src = blocks.vector_source_b (data)
50 | packer = blocks.unpacked_to_packed_bb(1, gr.GR_MSB_FIRST)
51 | dsss_encoder = dsss.dsss_encoder_bb(code)
52 | dst = blocks.vector_sink_b ()
53 |
54 | self.tb.connect (src, packer, dsss_encoder, dst)
55 | self.tb.start ()
56 | time.sleep(0.1)
57 | self.tb.stop()
58 |
59 | actual_result = list(dst.data ())
60 | self.assertTrue(len(actual_result) > len(expected_result)/2)
61 | self.assertEqual(actual_result, expected_result[:len(actual_result)])
62 |
63 | if __name__ == '__main__':
64 | gr_unittest.run(qa_dsss_encoder_bb, "qa_dsss_encoder_bb.xml")
65 |
--------------------------------------------------------------------------------
/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 dsss_sources)
24 | MESSAGE(STATUS "No C++ sources... skipping swig/")
25 | return()
26 | endif(NOT dsss_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-dsss gnuradio-filter)
47 | set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/dsss_swig_doc.i)
48 | set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
49 |
50 | GR_SWIG_MAKE(dsss_swig dsss_swig.i)
51 |
52 | ########################################################################
53 | # Install the build swig module
54 | ########################################################################
55 | GR_SWIG_INSTALL(TARGETS dsss_swig DESTINATION ${GR_PYTHON_DIR}/dsss)
56 |
57 | ########################################################################
58 | # Install swig .i files for development
59 | ########################################################################
60 | install(
61 | FILES
62 | dsss_swig.i
63 | ${CMAKE_CURRENT_BINARY_DIR}/dsss_swig_doc.i
64 | DESTINATION ${GR_INCLUDE_DIR}/dsss/swig
65 | )
66 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 dsss_sources
29 | dsss_encoder_bb_impl.cc
30 | dsss_decoder_cc_impl.cc
31 | )
32 |
33 | set(dsss_sources "${dsss_sources}" PARENT_SCOPE)
34 | if(NOT dsss_sources)
35 | MESSAGE(STATUS "No C++ sources... skipping lib/")
36 | return()
37 | endif(NOT dsss_sources)
38 |
39 | add_library(gnuradio-dsss SHARED ${dsss_sources})
40 | target_link_libraries(gnuradio-dsss ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES})
41 | set_target_properties(gnuradio-dsss PROPERTIES DEFINE_SYMBOL "gnuradio_dsss_EXPORTS")
42 |
43 | if(APPLE)
44 | set_target_properties(gnuradio-dsss PROPERTIES
45 | INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
46 | )
47 | endif(APPLE)
48 |
49 | ########################################################################
50 | # Install built library files
51 | ########################################################################
52 | install(TARGETS gnuradio-dsss
53 | LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file
54 | ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
55 | RUNTIME DESTINATION bin # .dll file
56 | )
57 |
58 | ########################################################################
59 | # Build and register unit test
60 | ########################################################################
61 | include(GrTest)
62 |
63 | include_directories(${CPPUNIT_INCLUDE_DIRS})
64 |
65 | list(APPEND test_dsss_sources
66 | ${CMAKE_CURRENT_SOURCE_DIR}/test_dsss.cc
67 | ${CMAKE_CURRENT_SOURCE_DIR}/qa_dsss.cc
68 | )
69 |
70 | add_executable(test-dsss ${test_dsss_sources})
71 |
72 | target_link_libraries(
73 | test-dsss
74 | ${GNURADIO_RUNTIME_LIBRARIES}
75 | gnuradio-filter
76 | ${Boost_LIBRARIES}
77 | ${CPPUNIT_LIBRARIES}
78 | gnuradio-dsss
79 | )
80 |
81 | GR_ADD_TEST(test_dsss test-dsss)
82 |
--------------------------------------------------------------------------------
/lib/dsss_encoder_bb_impl.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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 "dsss_encoder_bb_impl.h"
27 |
28 | namespace gr {
29 | namespace dsss {
30 |
31 | dsss_encoder_bb::sptr
32 | dsss_encoder_bb::make(const std::vector &code)
33 | {
34 | return gnuradio::get_initial_sptr
35 | (new dsss_encoder_bb_impl(code));
36 | }
37 |
38 | /*
39 | * The private constructor
40 | */
41 | dsss_encoder_bb_impl::dsss_encoder_bb_impl(const std::vector &code)
42 | : gr::block("dsss_encoder_bb",
43 | gr::io_signature::make(1, 1, sizeof(unsigned char)),
44 | gr::io_signature::make(1, 1, sizeof(unsigned char)))
45 | {
46 | set_code(code);
47 | }
48 |
49 | /*
50 | * Our virtual destructor.
51 | */
52 | dsss_encoder_bb_impl::~dsss_encoder_bb_impl()
53 | {
54 | /* NOP */
55 | }
56 |
57 | void
58 | dsss_encoder_bb_impl::set_code(const std::vector &code) {
59 | d_code = code;
60 | }
61 |
62 | void
63 | dsss_encoder_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
64 | {
65 | ninput_items_required[0] = (int) ceil(noutput_items / (8.0 * d_code.size()));
66 | }
67 |
68 | int
69 | dsss_encoder_bb_impl::general_work (int noutput_items,
70 | gr_vector_int &ninput_items,
71 | gr_vector_const_void_star &input_items,
72 | gr_vector_void_star &output_items)
73 | {
74 | const unsigned char *in = (const unsigned char *) input_items[0];
75 | unsigned char *out = (unsigned char *) output_items[0];
76 |
77 | int input_required = noutput_items / (8 * d_code.size());
78 |
79 | for (int i = 0; i < input_required; i++) {
80 | for (int j = 0; j < 8; j++) {
81 | int b = *in & (1 << (7-j));
82 |
83 | for (std::vector::iterator it = d_code.begin(); it != d_code.end(); ++it) {
84 | if (b == 0)
85 | *out = 1 & (*it);
86 | else
87 | *out = 1 & (~(*it));
88 | out++;
89 | }
90 | }
91 |
92 | in++;
93 | }
94 |
95 | // Tell runtime system how many input items we consumed on
96 | // each input stream.
97 | consume_each(input_required);
98 |
99 | // Tell runtime system how many output items we produced.
100 | return input_required*8*d_code.size();
101 | }
102 |
103 | } /* namespace dsss */
104 | } /* namespace gr */
105 |
--------------------------------------------------------------------------------
/lib/dsss_decoder_cc_impl.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2014 Eric de Groot (edegroot@email.arizona.edu).
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 |
27 | #include
28 | #include "dsss_decoder_cc_impl.h"
29 |
30 | #include
31 | #include
32 | #include
33 |
34 | namespace gr {
35 | namespace dsss {
36 |
37 | dsss_decoder_cc::sptr
38 | dsss_decoder_cc::make(const std::vector &code, float samples_per_symbol)
39 | {
40 | return gnuradio::get_initial_sptr
41 | (new dsss_decoder_cc_impl(code, samples_per_symbol));
42 | }
43 |
44 | /*
45 | * The private constructor
46 | */
47 | dsss_decoder_cc_impl::dsss_decoder_cc_impl(const std::vector &code, float samples_per_symbol)
48 | : gr::block("dsss_decoder_cc",
49 | gr::io_signature::make(1, 1, sizeof(gr_complex)),
50 | gr::io_signature::make(1, 1, sizeof(gr_complex)))
51 | {
52 | set_code(code);
53 |
54 | int bits_per_symbol = 1;
55 | int arity = pow(2, bits_per_symbol);
56 |
57 | int samples = (int) d_samples_per_symbol;
58 |
59 | int rrc_ntaps = samples * 11;
60 |
61 | int code_symbols_size = d_code.size() * samples;
62 | gr_complex* code_symbols = new gr_complex[code_symbols_size + 2 * rrc_ntaps];
63 |
64 | for (int i = 0; i < d_code.size(); i++) {
65 | gr_complex c = d_code[d_code.size() - (i + 1)] == 0 ? -1.0 : 1.0;
66 |
67 | code_symbols[rrc_ntaps + i * samples] = c;
68 |
69 | for (int k = 1; k < samples; k++) {
70 | code_symbols[rrc_ntaps + i * samples + k] = 0;
71 | }
72 | }
73 |
74 | float excess_bw = 0.350f;
75 | static std::vector rrc_taps =
76 | filter::firdes::root_raised_cosine(1, // gain
77 | d_samples_per_symbol, // sampling rate
78 | 1.0, // symbol rate
79 | excess_bw, // roll-off factor
80 | rrc_ntaps);
81 |
82 | filter::kernel::fir_filter_ccf *fir_filter = new filter::kernel::fir_filter_ccf(1, rrc_taps);
83 |
84 | // FIXME: Will only work for real constellations.
85 | for (int i = 0; i < code_symbols_size + rrc_ntaps; i++) {
86 | d_taps.push_back(fir_filter->filter(&code_symbols[i]).real());
87 | }
88 |
89 | d_match_filter = new filter::kernel::fir_filter_ccf(1, d_taps);
90 | set_history(d_match_filter->ntaps()+1);
91 |
92 | // clean-up
93 | delete fir_filter;
94 | delete code_symbols;
95 | }
96 |
97 | /*
98 | * Our virtual destructor.
99 | */
100 | dsss_decoder_cc_impl::~dsss_decoder_cc_impl()
101 | {
102 | delete d_match_filter;
103 | }
104 |
105 | void
106 | dsss_decoder_cc_impl::set_code(const std::vector &code) {
107 | d_code = code;
108 | }
109 |
110 | void
111 | dsss_decoder_cc_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
112 | {
113 | int code_sample_size = d_samples_per_symbol * d_code.size();
114 | ninput_items_required[0] = code_sample_size * noutput_items;
115 | }
116 |
117 | int
118 | dsss_decoder_cc_impl::general_work (int noutput_items,
119 | gr_vector_int &ninput_items,
120 | gr_vector_const_void_star &input_items,
121 | gr_vector_void_star &output_items)
122 | {
123 | const gr_complex *in = (const gr_complex *) input_items[0];
124 | gr_complex *out = (gr_complex *) output_items[0];
125 |
126 | int code_sample_size = d_samples_per_symbol * d_code.size();
127 | float max_abs_val, cur_abs_val;
128 | gr_complex max_val, cur_val;
129 | int consumed = 0, produced = 0;
130 |
131 | for (int i = 0; i < noutput_items; i++) {
132 | max_abs_val = 0;
133 | max_val = 0;
134 |
135 | // FIXME: Will not work for non-integer samples_per_symbols
136 | for (int j = 0; j < code_sample_size; j++) {
137 | cur_val = d_match_filter->filter(in + (i-1) * code_sample_size + j);
138 | cur_abs_val = abs(cur_val);
139 | if (cur_abs_val > max_abs_val) {
140 | max_abs_val = cur_abs_val;
141 | max_val = cur_val;
142 | }
143 |
144 | consumed++;
145 | }
146 | out[i] = max_val;
147 |
148 | produced++;
149 | }
150 |
151 | // Tell runtime system how many input items we consumed on
152 | // each input stream.
153 | consume_each(consumed);
154 |
155 | // Tell runtime system how many output items we produced.
156 | return produced;
157 | }
158 |
159 | } /* namespace dsss */
160 | } /* namespace gr */
161 |
--------------------------------------------------------------------------------
/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 | ########################################################################
34 | function(GR_ADD_TEST test_name)
35 |
36 | if(WIN32)
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 | #SWIG generates the python library files into a subdirectory.
54 | #Therefore, we must append this subdirectory into PYTHONPATH.
55 | #Only do this for the python directories matching the following:
56 | foreach(pydir ${GR_TEST_PYTHON_DIRS})
57 | get_filename_component(name ${pydir} NAME)
58 | if(name MATCHES "^(swig|lib|src)$")
59 | list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
60 | endif()
61 | endforeach(pydir)
62 | endif(WIN32)
63 |
64 | file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
65 | file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
66 | file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
67 |
68 | set(environs "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
69 |
70 | #http://www.cmake.org/pipermail/cmake/2009-May/029464.html
71 | #Replaced this add test + set environs code with the shell script generation.
72 | #Its nicer to be able to manually run the shell script to diagnose problems.
73 | #ADD_TEST(${ARGV})
74 | #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
75 |
76 | if(UNIX)
77 | set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
78 | #set both LD and DYLD paths to cover multiple UNIX OS library paths
79 | list(APPEND libpath "$LD_LIBRARY_PATH" "$DYLD_LIBRARY_PATH")
80 | list(APPEND pypath "$PYTHONPATH")
81 |
82 | #replace list separator with the path separator
83 | string(REPLACE ";" ":" libpath "${libpath}")
84 | string(REPLACE ";" ":" pypath "${pypath}")
85 | list(APPEND environs "PATH=${binpath}" "LD_LIBRARY_PATH=${libpath}" "DYLD_LIBRARY_PATH=${libpath}" "PYTHONPATH=${pypath}")
86 |
87 | #generate a bat file that sets the environment and runs the test
88 | find_program(SHELL sh)
89 | set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
90 | file(WRITE ${sh_file} "#!${SHELL}\n")
91 | #each line sets an environment variable
92 | foreach(environ ${environs})
93 | file(APPEND ${sh_file} "export ${environ}\n")
94 | endforeach(environ)
95 | #load the command to run with its arguments
96 | foreach(arg ${ARGN})
97 | file(APPEND ${sh_file} "${arg} ")
98 | endforeach(arg)
99 | file(APPEND ${sh_file} "\n")
100 |
101 | #make the shell file executable
102 | execute_process(COMMAND chmod +x ${sh_file})
103 |
104 | add_test(${test_name} ${SHELL} ${sh_file})
105 |
106 | endif(UNIX)
107 |
108 | if(WIN32)
109 | list(APPEND libpath ${DLL_PATHS} "%PATH%")
110 | list(APPEND pypath "%PYTHONPATH%")
111 |
112 | #replace list separator with the path separator (escaped)
113 | string(REPLACE ";" "\\;" libpath "${libpath}")
114 | string(REPLACE ";" "\\;" pypath "${pypath}")
115 | list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
116 |
117 | #generate a bat file that sets the environment and runs the test
118 | set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
119 | file(WRITE ${bat_file} "@echo off\n")
120 | #each line sets an environment variable
121 | foreach(environ ${environs})
122 | file(APPEND ${bat_file} "SET ${environ}\n")
123 | endforeach(environ)
124 | #load the command to run with its arguments
125 | foreach(arg ${ARGN})
126 | file(APPEND ${bat_file} "${arg} ")
127 | endforeach(arg)
128 | file(APPEND ${bat_file} "\n")
129 |
130 | add_test(${test_name} ${bat_file})
131 | endif(WIN32)
132 |
133 | endfunction(GR_ADD_TEST)
134 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 | ########################################################################
22 | # Project setup
23 | ########################################################################
24 | cmake_minimum_required(VERSION 2.6)
25 | project(gr-dsss CXX C)
26 | enable_testing()
27 |
28 | #select the release build type by default to get optimization flags
29 | if(NOT CMAKE_BUILD_TYPE)
30 | set(CMAKE_BUILD_TYPE "Release")
31 | message(STATUS "Build type not specified: defaulting to release.")
32 | endif(NOT CMAKE_BUILD_TYPE)
33 | set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
34 |
35 | list(APPEND CMAKE_MODULE_PATH ${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 dsss")
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/dsss)
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 | # Find gnuradio build dependencies
85 | ########################################################################
86 | find_package(CppUnit)
87 |
88 | # Search for GNU Radio and its components and versions. Add any
89 | # components required to the list of GR_REQUIRED_COMPONENTS (in all
90 | # caps such as FILTER or FFT) and change the version to the minimum
91 | # API compatible version required.
92 | set(GR_REQUIRED_COMPONENTS RUNTIME)
93 | find_package(Gnuradio "3.7.2" REQUIRED)
94 |
95 | if(NOT CPPUNIT_FOUND)
96 | message(FATAL_ERROR "CppUnit required to compile dsss")
97 | endif()
98 |
99 | ########################################################################
100 | # Setup the include and linker paths
101 | ########################################################################
102 | include_directories(
103 | ${CMAKE_SOURCE_DIR}/lib
104 | ${CMAKE_SOURCE_DIR}/include
105 | ${CMAKE_BINARY_DIR}/lib
106 | ${CMAKE_BINARY_DIR}/include
107 | ${Boost_INCLUDE_DIRS}
108 | ${CPPUNIT_INCLUDE_DIRS}
109 | ${GNURADIO_ALL_INCLUDE_DIRS}
110 | )
111 |
112 | link_directories(
113 | ${Boost_LIBRARY_DIRS}
114 | ${CPPUNIT_LIBRARY_DIRS}
115 | ${GNURADIO_RUNTIME_LIBRARY_DIRS}
116 | )
117 |
118 | # Set component parameters
119 | set(GR_DSSS_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
120 | set(GR_DSSS_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
121 |
122 | ########################################################################
123 | # Create uninstall target
124 | ########################################################################
125 | configure_file(
126 | ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
127 | ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
128 | @ONLY)
129 |
130 | add_custom_target(uninstall
131 | ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
132 | )
133 |
134 | ########################################################################
135 | # Add subdirectories
136 | ########################################################################
137 | add_subdirectory(include/dsss)
138 | add_subdirectory(lib)
139 | add_subdirectory(swig)
140 | add_subdirectory(python)
141 | add_subdirectory(grc)
142 | add_subdirectory(apps)
143 | add_subdirectory(docs)
144 |
145 | ########################################################################
146 | # Install cmake search helper for this library
147 | ########################################################################
148 | install(FILES cmake/Modules/dsssConfig.cmake
149 | DESTINATION lib/cmake/dsss
150 | )
151 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/cmake/Modules/GrMiscUtils.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_MISC_UTILS_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Set global variable macro.
27 | # Used for subdirectories to export settings.
28 | # Example: include and library paths.
29 | ########################################################################
30 | function(GR_SET_GLOBAL var)
31 | set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
32 | endfunction(GR_SET_GLOBAL)
33 |
34 | ########################################################################
35 | # Set the pre-processor definition if the condition is true.
36 | # - def the pre-processor definition to set and condition name
37 | ########################################################################
38 | function(GR_ADD_COND_DEF def)
39 | if(${def})
40 | add_definitions(-D${def})
41 | endif(${def})
42 | endfunction(GR_ADD_COND_DEF)
43 |
44 | ########################################################################
45 | # Check for a header and conditionally set a compile define.
46 | # - hdr the relative path to the header file
47 | # - def the pre-processor definition to set
48 | ########################################################################
49 | function(GR_CHECK_HDR_N_DEF hdr def)
50 | include(CheckIncludeFileCXX)
51 | CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
52 | GR_ADD_COND_DEF(${def})
53 | endfunction(GR_CHECK_HDR_N_DEF)
54 |
55 | ########################################################################
56 | # Include subdirectory macro.
57 | # Sets the CMake directory variables,
58 | # includes the subdirectory CMakeLists.txt,
59 | # resets the CMake directory variables.
60 | #
61 | # This macro includes subdirectories rather than adding them
62 | # so that the subdirectory can affect variables in the level above.
63 | # This provides a work-around for the lack of convenience libraries.
64 | # This way a subdirectory can append to the list of library sources.
65 | ########################################################################
66 | macro(GR_INCLUDE_SUBDIRECTORY subdir)
67 | #insert the current directories on the front of the list
68 | list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
69 | list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
70 |
71 | #set the current directories to the names of the subdirs
72 | set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
73 | set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
74 |
75 | #include the subdirectory CMakeLists to run it
76 | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
77 | include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
78 |
79 | #reset the value of the current directories
80 | list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
81 | list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
82 |
83 | #pop the subdir names of the front of the list
84 | list(REMOVE_AT _cmake_source_dirs 0)
85 | list(REMOVE_AT _cmake_binary_dirs 0)
86 | endmacro(GR_INCLUDE_SUBDIRECTORY)
87 |
88 | ########################################################################
89 | # Check if a compiler flag works and conditionally set a compile define.
90 | # - flag the compiler flag to check for
91 | # - have the variable to set with result
92 | ########################################################################
93 | macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
94 | include(CheckCXXCompilerFlag)
95 | CHECK_CXX_COMPILER_FLAG(${flag} ${have})
96 | if(${have})
97 | add_definitions(${flag})
98 | endif(${have})
99 | endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
100 |
101 | ########################################################################
102 | # Generates the .la libtool file
103 | # This appears to generate libtool files that cannot be used by auto*.
104 | # Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
105 | # Notice: there is not COMPONENT option, these will not get distributed.
106 | ########################################################################
107 | function(GR_LIBTOOL)
108 | if(NOT DEFINED GENERATE_LIBTOOL)
109 | set(GENERATE_LIBTOOL OFF) #disabled by default
110 | endif()
111 |
112 | if(GENERATE_LIBTOOL)
113 | include(CMakeParseArgumentsCopy)
114 | CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
115 |
116 | find_program(LIBTOOL libtool)
117 | if(LIBTOOL)
118 | include(CMakeMacroLibtoolFile)
119 | CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
120 | endif(LIBTOOL)
121 | endif(GENERATE_LIBTOOL)
122 |
123 | endfunction(GR_LIBTOOL)
124 |
125 | ########################################################################
126 | # Do standard things to the library target
127 | # - set target properties
128 | # - make install rules
129 | # Also handle gnuradio custom naming conventions w/ extras mode.
130 | ########################################################################
131 | function(GR_LIBRARY_FOO target)
132 | #parse the arguments for component names
133 | include(CMakeParseArgumentsCopy)
134 | CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
135 |
136 | #set additional target properties
137 | set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
138 |
139 | #install the generated files like so...
140 | install(TARGETS ${target}
141 | LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
142 | ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file
143 | RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
144 | )
145 |
146 | #extras mode enabled automatically on linux
147 | if(NOT DEFINED LIBRARY_EXTRAS)
148 | set(LIBRARY_EXTRAS ${LINUX})
149 | endif()
150 |
151 | #special extras mode to enable alternative naming conventions
152 | if(LIBRARY_EXTRAS)
153 |
154 | #create .la file before changing props
155 | GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
156 |
157 | #give the library a special name with ultra-zero soversion
158 | set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
159 | set(target_name lib${target}-${LIBVER}.so.0.0.0)
160 |
161 | #custom command to generate symlinks
162 | add_custom_command(
163 | TARGET ${target}
164 | POST_BUILD
165 | COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
166 | COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
167 | COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
168 | )
169 |
170 | #and install the extra symlinks
171 | install(
172 | FILES
173 | ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
174 | ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
175 | DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
176 | )
177 |
178 | endif(LIBRARY_EXTRAS)
179 | endfunction(GR_LIBRARY_FOO)
180 |
181 | ########################################################################
182 | # Create a dummy custom command that depends on other targets.
183 | # Usage:
184 | # GR_GEN_TARGET_DEPS(unique_name target_deps ...)
185 | # ADD_CUSTOM_COMMAND( ${target_deps})
186 | #
187 | # Custom command cant depend on targets, but can depend on executables,
188 | # and executables can depend on targets. So this is the process:
189 | ########################################################################
190 | function(GR_GEN_TARGET_DEPS name var)
191 | file(
192 | WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
193 | "int main(void){return 0;}\n"
194 | )
195 | execute_process(
196 | COMMAND ${CMAKE_COMMAND} -E copy_if_different
197 | ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
198 | ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
199 | )
200 | add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
201 | if(ARGN)
202 | add_dependencies(${name} ${ARGN})
203 | endif(ARGN)
204 |
205 | if(CMAKE_CROSSCOMPILING)
206 | set(${var} "DEPENDS;${name}" PARENT_SCOPE) #cant call command when cross
207 | else()
208 | set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
209 | endif()
210 | endfunction(GR_GEN_TARGET_DEPS)
211 |
--------------------------------------------------------------------------------
/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 | find_package(Doxygen)
37 | if(DOXYGEN_FOUND)
38 |
39 | #setup the input files variable list, quote formated
40 | set(input_files)
41 | unset(INPUT_PATHS)
42 | foreach(input_path ${ARGN})
43 | if (IS_DIRECTORY ${input_path}) #when input path is a directory
44 | file(GLOB input_path_h_files ${input_path}/*.h)
45 | else() #otherwise its just a file, no glob
46 | set(input_path_h_files ${input_path})
47 | endif()
48 | list(APPEND input_files ${input_path_h_files})
49 | set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
50 | endforeach(input_path)
51 |
52 | #determine the output directory
53 | get_filename_component(name ${output_file} NAME_WE)
54 | get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
55 | set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
56 | make_directory(${OUTPUT_DIRECTORY})
57 |
58 | #generate the Doxyfile used by doxygen
59 | configure_file(
60 | ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
61 | ${OUTPUT_DIRECTORY}/Doxyfile
62 | @ONLY)
63 |
64 | #Create a dummy custom command that depends on other targets
65 | include(GrMiscUtils)
66 | GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
67 |
68 | #call doxygen on the Doxyfile + input headers
69 | add_custom_command(
70 | OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
71 | DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
72 | COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
73 | COMMENT "Generating doxygen xml for ${name} docs"
74 | )
75 |
76 | #call the swig_doc script on the xml files
77 | add_custom_command(
78 | OUTPUT ${output_file}
79 | DEPENDS ${input_files} ${OUTPUT_DIRECTORY}/xml/index.xml
80 | COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
81 | ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
82 | ${OUTPUT_DIRECTORY}/xml
83 | ${output_file}
84 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
85 | )
86 |
87 | else(DOXYGEN_FOUND)
88 | file(WRITE ${output_file} "\n") #no doxygen -> empty file
89 | endif(DOXYGEN_FOUND)
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 | #do swig doc generation if specified
109 | if (GR_SWIG_DOC_FILE)
110 | set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
111 | set(GR_SWIG_DOCS_TAREGT_DEPS ${GR_SWIG_TARGET_DEPS})
112 | GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
113 | list(APPEND GR_SWIG_SOURCE_DEPS ${GR_SWIG_DOC_FILE})
114 | endif()
115 |
116 | #append additional include directories
117 | find_package(PythonLibs 2)
118 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
119 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
120 | list(APPEND GR_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR})
121 | list(APPEND GR_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR})
122 |
123 | #determine include dependencies for swig file
124 | execute_process(
125 | COMMAND ${PYTHON_EXECUTABLE}
126 | ${CMAKE_BINARY_DIR}/get_swig_deps.py
127 | "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
128 | OUTPUT_STRIP_TRAILING_WHITESPACE
129 | OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
130 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
131 | )
132 |
133 | #Create a dummy custom command that depends on other targets
134 | include(GrMiscUtils)
135 | GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
136 | set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
137 | add_custom_command(
138 | OUTPUT ${tag_file}
139 | DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
140 | COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
141 | )
142 |
143 | #append the specified include directories
144 | include_directories(${GR_SWIG_INCLUDE_DIRS})
145 | list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
146 |
147 | #setup the swig flags with flags and include directories
148 | set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
149 | foreach(dir ${GR_SWIG_INCLUDE_DIRS})
150 | list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
151 | endforeach(dir)
152 |
153 | #set the C++ property on the swig .i file so it builds
154 | set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
155 |
156 | #setup the actual swig library target to be built
157 | include(UseSWIG)
158 | SWIG_ADD_MODULE(${name} python ${ifiles})
159 | SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES})
160 |
161 | endmacro(GR_SWIG_MAKE)
162 |
163 | ########################################################################
164 | # Install swig targets generated by GR_SWIG_MAKE. Usage:
165 | # GR_SWIG_INSTALL(
166 | # TARGETS target target target...
167 | # [DESTINATION destination]
168 | # [COMPONENT component]
169 | # )
170 | ########################################################################
171 | macro(GR_SWIG_INSTALL)
172 |
173 | include(CMakeParseArgumentsCopy)
174 | CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
175 |
176 | foreach(name ${GR_SWIG_INSTALL_TARGETS})
177 | install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
178 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
179 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
180 | )
181 |
182 | include(GrPython)
183 | GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
184 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
185 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
186 | )
187 |
188 | GR_LIBTOOL(
189 | TARGET ${SWIG_MODULE_${name}_REAL_NAME}
190 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
191 | )
192 |
193 | endforeach(name)
194 |
195 | endmacro(GR_SWIG_INSTALL)
196 |
197 | ########################################################################
198 | # Generate a python file that can determine swig dependencies.
199 | # Used by the make macro above to determine extra dependencies.
200 | # When you build C++, CMake figures out the header dependencies.
201 | # This code essentially performs that logic for swig includes.
202 | ########################################################################
203 | file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
204 |
205 | import os, sys, re
206 |
207 | include_matcher = re.compile('[#|%]include\\s*[<|\"](.*)[>|\"]')
208 | include_dirs = sys.argv[2].split(';')
209 |
210 | def get_swig_incs(file_path):
211 | file_contents = open(file_path, 'r').read()
212 | return include_matcher.findall(file_contents, re.MULTILINE)
213 |
214 | def get_swig_deps(file_path, level):
215 | deps = [file_path]
216 | if level == 0: return deps
217 | for inc_file in get_swig_incs(file_path):
218 | for inc_dir in include_dirs:
219 | inc_path = os.path.join(inc_dir, inc_file)
220 | if not os.path.exists(inc_path): continue
221 | deps.extend(get_swig_deps(inc_path, level-1))
222 | return deps
223 |
224 | if __name__ == '__main__':
225 | ifiles = sys.argv[1].split(';')
226 | deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
227 | #sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
228 | print(';'.join(set(deps)))
229 | ")
230 |
--------------------------------------------------------------------------------
/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 | #make the path to the executable appear in the cmake gui
52 | set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
53 |
54 | #make sure we can use -B with python (introduced in 2.6)
55 | if(PYTHON_EXECUTABLE)
56 | execute_process(
57 | COMMAND ${PYTHON_EXECUTABLE} -B -c ""
58 | OUTPUT_QUIET ERROR_QUIET
59 | RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
60 | )
61 | if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
62 | set(PYTHON_DASH_B "-B")
63 | endif()
64 | endif(PYTHON_EXECUTABLE)
65 |
66 | ########################################################################
67 | # Check for the existence of a python module:
68 | # - desc a string description of the check
69 | # - mod the name of the module to import
70 | # - cmd an additional command to run
71 | # - have the result variable to set
72 | ########################################################################
73 | macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
74 | message(STATUS "")
75 | message(STATUS "Python checking for ${desc}")
76 | execute_process(
77 | COMMAND ${PYTHON_EXECUTABLE} -c "
78 | #########################################
79 | try: import ${mod}
80 | except: exit(-1)
81 | try: assert ${cmd}
82 | except: exit(-1)
83 | #########################################"
84 | RESULT_VARIABLE ${have}
85 | )
86 | if(${have} EQUAL 0)
87 | message(STATUS "Python checking for ${desc} - found")
88 | set(${have} TRUE)
89 | else(${have} EQUAL 0)
90 | message(STATUS "Python checking for ${desc} - not found")
91 | set(${have} FALSE)
92 | endif(${have} EQUAL 0)
93 | endmacro(GR_PYTHON_CHECK_MODULE)
94 |
95 | ########################################################################
96 | # Sets the python installation directory GR_PYTHON_DIR
97 | ########################################################################
98 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
99 | from distutils import sysconfig
100 | print sysconfig.get_python_lib(plat_specific=True, prefix='')
101 | " OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
102 | )
103 | file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
104 |
105 | ########################################################################
106 | # Create an always-built target with a unique name
107 | # Usage: GR_UNIQUE_TARGET( )
108 | ########################################################################
109 | function(GR_UNIQUE_TARGET desc)
110 | file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
111 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
112 | unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
113 | print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
114 | OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
115 | add_custom_target(${_target} ALL DEPENDS ${ARGN})
116 | endfunction(GR_UNIQUE_TARGET)
117 |
118 | ########################################################################
119 | # Install python sources (also builds and installs byte-compiled python)
120 | ########################################################################
121 | function(GR_PYTHON_INSTALL)
122 | include(CMakeParseArgumentsCopy)
123 | CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
124 |
125 | ####################################################################
126 | if(GR_PYTHON_INSTALL_FILES)
127 | ####################################################################
128 | install(${ARGN}) #installs regular python files
129 |
130 | #create a list of all generated files
131 | unset(pysrcfiles)
132 | unset(pycfiles)
133 | unset(pyofiles)
134 | foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
135 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
136 | list(APPEND pysrcfiles ${pyfile})
137 |
138 | #determine if this file is in the source or binary directory
139 | file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
140 | string(LENGTH "${source_rel_path}" source_rel_path_len)
141 | file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
142 | string(LENGTH "${binary_rel_path}" binary_rel_path_len)
143 |
144 | #and set the generated path appropriately
145 | if(${source_rel_path_len} GREATER ${binary_rel_path_len})
146 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
147 | else()
148 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
149 | endif()
150 | list(APPEND pycfiles ${pygenfile}c)
151 | list(APPEND pyofiles ${pygenfile}o)
152 |
153 | #ensure generation path exists
154 | get_filename_component(pygen_path ${pygenfile} PATH)
155 | file(MAKE_DIRECTORY ${pygen_path})
156 |
157 | endforeach(pyfile)
158 |
159 | #the command to generate the pyc files
160 | add_custom_command(
161 | DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
162 | COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
163 | )
164 |
165 | #the command to generate the pyo files
166 | add_custom_command(
167 | DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
168 | COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
169 | )
170 |
171 | #create install rule and add generated files to target list
172 | set(python_install_gen_targets ${pycfiles} ${pyofiles})
173 | install(FILES ${python_install_gen_targets}
174 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
175 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
176 | )
177 |
178 |
179 | ####################################################################
180 | elseif(GR_PYTHON_INSTALL_PROGRAMS)
181 | ####################################################################
182 | file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
183 |
184 | foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
185 | get_filename_component(pyfile_name ${pyfile} NAME)
186 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
187 | string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
188 | list(APPEND python_install_gen_targets ${pyexefile})
189 |
190 | get_filename_component(pyexefile_path ${pyexefile} PATH)
191 | file(MAKE_DIRECTORY ${pyexefile_path})
192 |
193 | add_custom_command(
194 | OUTPUT ${pyexefile} DEPENDS ${pyfile}
195 | COMMAND ${PYTHON_EXECUTABLE} -c
196 | \"open('${pyexefile}', 'w').write('\#!${pyexe_native}\\n'+open('${pyfile}').read())\"
197 | COMMENT "Shebangin ${pyfile_name}"
198 | )
199 |
200 | #on windows, python files need an extension to execute
201 | get_filename_component(pyfile_ext ${pyfile} EXT)
202 | if(WIN32 AND NOT pyfile_ext)
203 | set(pyfile_name "${pyfile_name}.py")
204 | endif()
205 |
206 | install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
207 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
208 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
209 | )
210 | endforeach(pyfile)
211 |
212 | endif()
213 |
214 | GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
215 |
216 | endfunction(GR_PYTHON_INSTALL)
217 |
218 | ########################################################################
219 | # Write the python helper script that generates byte code files
220 | ########################################################################
221 | file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
222 | import sys, py_compile
223 | files = sys.argv[1:]
224 | srcs, gens = files[:len(files)/2], files[len(files)/2:]
225 | for src, gen in zip(srcs, gens):
226 | py_compile.compile(file=src, cfile=gen, doraise=True)
227 | ")
228 |
--------------------------------------------------------------------------------
/examples/dsss_encoder.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 | Mon Jun 17 15:17:08 2013
4 |
5 | options
6 |
7 | id
8 | top_block
9 |
10 |
11 | _enabled
12 | True
13 |
14 |
15 | title
16 |
17 |
18 |
19 | author
20 |
21 |
22 |
23 | description
24 |
25 |
26 |
27 | window_size
28 | 1280, 1024
29 |
30 |
31 | generate_options
32 | wx_gui
33 |
34 |
35 | category
36 | Custom
37 |
38 |
39 | run_options
40 | prompt
41 |
42 |
43 | run
44 | True
45 |
46 |
47 | max_nouts
48 | 0
49 |
50 |
51 | realtime_scheduling
52 |
53 |
54 |
55 | _coordinate
56 | (7, 23)
57 |
58 |
59 | _rotation
60 | 0
61 |
62 |
63 |
64 | variable
65 |
66 | id
67 | samp_rate
68 |
69 |
70 | _enabled
71 | True
72 |
73 |
74 | value
75 | 10000
76 |
77 |
78 | _coordinate
79 | (7, 148)
80 |
81 |
82 | _rotation
83 | 0
84 |
85 |
86 |
87 | variable
88 |
89 | id
90 | samples_per_symbol
91 |
92 |
93 | _enabled
94 | True
95 |
96 |
97 | value
98 | 8
99 |
100 |
101 | _coordinate
102 | (8, 84)
103 |
104 |
105 | _rotation
106 | 0
107 |
108 |
109 |
110 | gr_throttle
111 |
112 | id
113 | gr_throttle_0
114 |
115 |
116 | _enabled
117 | True
118 |
119 |
120 | type
121 | byte
122 |
123 |
124 | samples_per_second
125 | samp_rate
126 |
127 |
128 | vlen
129 | 1
130 |
131 |
132 | _coordinate
133 | (347, 142)
134 |
135 |
136 | _rotation
137 | 0
138 |
139 |
140 |
141 | gr_vector_source_x
142 |
143 | id
144 | gr_vector_source_x_0
145 |
146 |
147 | _enabled
148 | True
149 |
150 |
151 | type
152 | byte
153 |
154 |
155 | vector
156 | ( 15 )
157 |
158 |
159 | repeat
160 | True
161 |
162 |
163 | vlen
164 | 1
165 |
166 |
167 | _coordinate
168 | (155, 171)
169 |
170 |
171 | _rotation
172 | 0
173 |
174 |
175 |
176 | blocks_uchar_to_float
177 |
178 | id
179 | blocks_uchar_to_float_0
180 |
181 |
182 | _enabled
183 | True
184 |
185 |
186 | _coordinate
187 | (725, 217)
188 |
189 |
190 | _rotation
191 | 0
192 |
193 |
194 |
195 | wxgui_scopesink2
196 |
197 | id
198 | wxgui_scopesink2_0
199 |
200 |
201 | _enabled
202 | True
203 |
204 |
205 | type
206 | float
207 |
208 |
209 | title
210 | Scope Plot
211 |
212 |
213 | samp_rate
214 | samp_rate
215 |
216 |
217 | v_scale
218 | 0
219 |
220 |
221 | v_offset
222 | 0
223 |
224 |
225 | t_scale
226 | 0
227 |
228 |
229 | ac_couple
230 | False
231 |
232 |
233 | xy_mode
234 | False
235 |
236 |
237 | num_inputs
238 | 1
239 |
240 |
241 | win_size
242 |
243 |
244 |
245 | grid_pos
246 |
247 |
248 |
249 | notebook
250 |
251 |
252 |
253 | trig_mode
254 | gr.gr_TRIG_MODE_AUTO
255 |
256 |
257 | y_axis_label
258 | Counts
259 |
260 |
261 | _coordinate
262 | (924, 181)
263 |
264 |
265 | _rotation
266 | 0
267 |
268 |
269 |
270 | dsss_dsss_encoder_bb
271 |
272 | id
273 | dsss_dsss_encoder_bb_0
274 |
275 |
276 | _enabled
277 | True
278 |
279 |
280 | code
281 | ( 1 )
282 |
283 |
284 | _coordinate
285 | (552, 140)
286 |
287 |
288 | _rotation
289 | 0
290 |
291 |
292 |
293 | variable
294 |
295 | id
296 | excess_bw
297 |
298 |
299 | _enabled
300 | True
301 |
302 |
303 | value
304 | 0.350
305 |
306 |
307 | _coordinate
308 | (194, 31)
309 |
310 |
311 | _rotation
312 | 0
313 |
314 |
315 |
316 | wxgui_scopesink2
317 |
318 | id
319 | wxgui_scopesink2_1
320 |
321 |
322 | _enabled
323 | True
324 |
325 |
326 | type
327 | complex
328 |
329 |
330 | title
331 | Scope Plot
332 |
333 |
334 | samp_rate
335 | samp_rate
336 |
337 |
338 | v_scale
339 | 0
340 |
341 |
342 | v_offset
343 | 0
344 |
345 |
346 | t_scale
347 | 0
348 |
349 |
350 | ac_couple
351 | False
352 |
353 |
354 | xy_mode
355 | False
356 |
357 |
358 | num_inputs
359 | 1
360 |
361 |
362 | win_size
363 |
364 |
365 |
366 | grid_pos
367 |
368 |
369 |
370 | notebook
371 |
372 |
373 |
374 | trig_mode
375 | gr.gr_TRIG_MODE_AUTO
376 |
377 |
378 | y_axis_label
379 | Counts
380 |
381 |
382 | _coordinate
383 | (1056, 65)
384 |
385 |
386 | _rotation
387 | 0
388 |
389 |
390 |
391 | digital_psk_mod
392 |
393 | id
394 | digital_psk_mod_0
395 |
396 |
397 | _enabled
398 | True
399 |
400 |
401 | constellation_points
402 | 2
403 |
404 |
405 | mod_code
406 | "none"
407 |
408 |
409 | differential
410 | False
411 |
412 |
413 | samples_per_symbol
414 | samples_per_symbol
415 |
416 |
417 | excess_bw
418 | excess_bw
419 |
420 |
421 | verbose
422 | False
423 |
424 |
425 | log
426 | False
427 |
428 |
429 | _coordinate
430 | (763, 47)
431 |
432 |
433 | _rotation
434 | 0
435 |
436 |
437 |
438 | gr_throttle_0
439 | dsss_dsss_encoder_bb_0
440 | 0
441 | 0
442 |
443 |
444 | gr_vector_source_x_0
445 | gr_throttle_0
446 | 0
447 | 0
448 |
449 |
450 | dsss_dsss_encoder_bb_0
451 | blocks_uchar_to_float_0
452 | 0
453 | 0
454 |
455 |
456 | blocks_uchar_to_float_0
457 | wxgui_scopesink2_0
458 | 0
459 | 0
460 |
461 |
462 | dsss_dsss_encoder_bb_0
463 | digital_psk_mod_0
464 | 0
465 | 0
466 |
467 |
468 | digital_psk_mod_0
469 | wxgui_scopesink2_1
470 | 0
471 | 0
472 |
473 |
474 |
--------------------------------------------------------------------------------
/examples/dsss_decoder2.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 | Thu Jun 13 11:49:34 2013
4 |
5 | options
6 |
7 | id
8 | top_block
9 |
10 |
11 | _enabled
12 | True
13 |
14 |
15 | title
16 |
17 |
18 |
19 | author
20 |
21 |
22 |
23 | description
24 |
25 |
26 |
27 | window_size
28 | 1280, 1024
29 |
30 |
31 | generate_options
32 | wx_gui
33 |
34 |
35 | category
36 | Custom
37 |
38 |
39 | run_options
40 | prompt
41 |
42 |
43 | run
44 | True
45 |
46 |
47 | max_nouts
48 | 0
49 |
50 |
51 | realtime_scheduling
52 |
53 |
54 |
55 | _coordinate
56 | (10, 10)
57 |
58 |
59 | _rotation
60 | 0
61 |
62 |
63 |
64 | variable
65 |
66 | id
67 | excess_bw
68 |
69 |
70 | _enabled
71 | True
72 |
73 |
74 | value
75 | 0.350
76 |
77 |
78 | _coordinate
79 | (10, 240)
80 |
81 |
82 | _rotation
83 | 0
84 |
85 |
86 |
87 | variable
88 |
89 | id
90 | samp_rate
91 |
92 |
93 | _enabled
94 | True
95 |
96 |
97 | value
98 | 32000
99 |
100 |
101 | _coordinate
102 | (10, 170)
103 |
104 |
105 | _rotation
106 | 0
107 |
108 |
109 |
110 | variable
111 |
112 | id
113 | samples_per_symbol
114 |
115 |
116 | _enabled
117 | True
118 |
119 |
120 | value
121 | 8
122 |
123 |
124 | _coordinate
125 | (32, 93)
126 |
127 |
128 | _rotation
129 | 0
130 |
131 |
132 |
133 | gr_throttle
134 |
135 | id
136 | gr_throttle_0
137 |
138 |
139 | _enabled
140 | True
141 |
142 |
143 | type
144 | byte
145 |
146 |
147 | samples_per_second
148 | samp_rate
149 |
150 |
151 | vlen
152 | 1
153 |
154 |
155 | _coordinate
156 | (179, 319)
157 |
158 |
159 | _rotation
160 | 0
161 |
162 |
163 |
164 | dsss_dsss_encoder_bb
165 |
166 | id
167 | dsss_dsss_encoder_bb_0
168 |
169 |
170 | _enabled
171 | True
172 |
173 |
174 | code
175 | ( 157 )
176 |
177 |
178 | _coordinate
179 | (201, 250)
180 |
181 |
182 | _rotation
183 | 0
184 |
185 |
186 |
187 | digital_psk_mod
188 |
189 | id
190 | digital_psk_mod_0
191 |
192 |
193 | _enabled
194 | True
195 |
196 |
197 | constellation_points
198 | 2
199 |
200 |
201 | mod_code
202 | "none"
203 |
204 |
205 | differential
206 | False
207 |
208 |
209 | samples_per_symbol
210 | samples_per_symbol
211 |
212 |
213 | excess_bw
214 | excess_bw
215 |
216 |
217 | verbose
218 | False
219 |
220 |
221 | log
222 | False
223 |
224 |
225 | _coordinate
226 | (336, 112)
227 |
228 |
229 | _rotation
230 | 0
231 |
232 |
233 |
234 | gr_vector_source_x
235 |
236 | id
237 | gr_vector_source_x_0
238 |
239 |
240 | _enabled
241 | True
242 |
243 |
244 | type
245 | byte
246 |
247 |
248 | vector
249 | (15)
250 |
251 |
252 | repeat
253 | True
254 |
255 |
256 | vlen
257 | 1
258 |
259 |
260 | _coordinate
261 | (80, 414)
262 |
263 |
264 | _rotation
265 | 0
266 |
267 |
268 |
269 | variable
270 |
271 | id
272 | bits_per_symbol
273 |
274 |
275 | _enabled
276 | True
277 |
278 |
279 | value
280 | 1
281 |
282 |
283 | _coordinate
284 | (193, 15)
285 |
286 |
287 | _rotation
288 | 0
289 |
290 |
291 |
292 | variable
293 |
294 | id
295 | arity
296 |
297 |
298 | _enabled
299 | True
300 |
301 |
302 | value
303 | pow(2, bits_per_symbol)
304 |
305 |
306 | _coordinate
307 | (323, 18)
308 |
309 |
310 | _rotation
311 | 0
312 |
313 |
314 |
315 | blocks_complex_to_real
316 |
317 | id
318 | blocks_complex_to_real_0_0_0
319 |
320 |
321 | _enabled
322 | True
323 |
324 |
325 | vlen
326 | 1
327 |
328 |
329 | _coordinate
330 | (629.5, 143.0)
331 |
332 |
333 | _rotation
334 | 0
335 |
336 |
337 |
338 | dsss_dsss_decoder_cc
339 |
340 | id
341 | dsss_dsss_decoder_cc_0
342 |
343 |
344 | _enabled
345 | True
346 |
347 |
348 | code
349 | ( 157 )
350 |
351 |
352 | samples_per_symbol
353 | samples_per_symbol
354 |
355 |
356 | _coordinate
357 | (514, 254)
358 |
359 |
360 | _rotation
361 | 0
362 |
363 |
364 |
365 | wxgui_scopesink2
366 |
367 | id
368 | wxgui_scopesink2_0
369 |
370 |
371 | _enabled
372 | True
373 |
374 |
375 | type
376 | float
377 |
378 |
379 | title
380 | Scope Plot
381 |
382 |
383 | samp_rate
384 | samp_rate
385 |
386 |
387 | v_scale
388 | 0
389 |
390 |
391 | v_offset
392 | 0
393 |
394 |
395 | t_scale
396 | 0
397 |
398 |
399 | ac_couple
400 | False
401 |
402 |
403 | xy_mode
404 | False
405 |
406 |
407 | num_inputs
408 | 2
409 |
410 |
411 | win_size
412 |
413 |
414 |
415 | grid_pos
416 |
417 |
418 |
419 | notebook
420 |
421 |
422 |
423 | trig_mode
424 | gr.gr_TRIG_MODE_AUTO
425 |
426 |
427 | y_axis_label
428 | Counts
429 |
430 |
431 | _coordinate
432 | (962, 184)
433 |
434 |
435 | _rotation
436 | 0
437 |
438 |
439 |
440 | blocks_complex_to_real
441 |
442 | id
443 | blocks_complex_to_real_0_0_0_0
444 |
445 |
446 | _enabled
447 | True
448 |
449 |
450 | vlen
451 | 1
452 |
453 |
454 | _coordinate
455 | (730, 237)
456 |
457 |
458 | _rotation
459 | 0
460 |
461 |
462 |
463 | gr_vector_source_x_0
464 | gr_throttle_0
465 | 0
466 | 0
467 |
468 |
469 | digital_psk_mod_0
470 | blocks_complex_to_real_0_0_0
471 | 0
472 | 0
473 |
474 |
475 | blocks_complex_to_real_0_0_0
476 | wxgui_scopesink2_0
477 | 0
478 | 0
479 |
480 |
481 | gr_throttle_0
482 | dsss_dsss_encoder_bb_0
483 | 0
484 | 0
485 |
486 |
487 | dsss_dsss_encoder_bb_0
488 | digital_psk_mod_0
489 | 0
490 | 0
491 |
492 |
493 | digital_psk_mod_0
494 | dsss_dsss_decoder_cc_0
495 | 0
496 | 0
497 |
498 |
499 | dsss_dsss_decoder_cc_0
500 | blocks_complex_to_real_0_0_0_0
501 | 0
502 | 0
503 |
504 |
505 | blocks_complex_to_real_0_0_0_0
506 | wxgui_scopesink2_0
507 | 0
508 | 1
509 |
510 |
511 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/generated/indexsuper.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | #
4 | # Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
5 | #
6 |
7 | import sys
8 | import getopt
9 | from string import lower as str_lower
10 | from xml.dom import minidom
11 | from xml.dom import Node
12 |
13 | #
14 | # User methods
15 | #
16 | # Calls to the methods in these classes are generated by generateDS.py.
17 | # You can replace these methods by re-implementing the following class
18 | # in a module named generatedssuper.py.
19 |
20 | try:
21 | from generatedssuper import GeneratedsSuper
22 | except ImportError, exp:
23 |
24 | class GeneratedsSuper:
25 | def format_string(self, input_data, input_name=''):
26 | return input_data
27 | def format_integer(self, input_data, input_name=''):
28 | return '%d' % input_data
29 | def format_float(self, input_data, input_name=''):
30 | return '%f' % input_data
31 | def format_double(self, input_data, input_name=''):
32 | return '%e' % input_data
33 | def format_boolean(self, input_data, input_name=''):
34 | return '%s' % input_data
35 |
36 |
37 | #
38 | # If you have installed IPython you can uncomment and use the following.
39 | # IPython is available from http://ipython.scipy.org/.
40 | #
41 |
42 | ## from IPython.Shell import IPShellEmbed
43 | ## args = ''
44 | ## ipshell = IPShellEmbed(args,
45 | ## banner = 'Dropping into IPython',
46 | ## exit_msg = 'Leaving Interpreter, back to program.')
47 |
48 | # Then use the following line where and when you want to drop into the
49 | # IPython shell:
50 | # ipshell(' -- Entering ipshell.\nHit Ctrl-D to exit')
51 |
52 | #
53 | # Globals
54 | #
55 |
56 | ExternalEncoding = 'ascii'
57 |
58 | #
59 | # Support/utility functions.
60 | #
61 |
62 | def showIndent(outfile, level):
63 | for idx in range(level):
64 | outfile.write(' ')
65 |
66 | def quote_xml(inStr):
67 | s1 = (isinstance(inStr, basestring) and inStr or
68 | '%s' % inStr)
69 | s1 = s1.replace('&', '&')
70 | s1 = s1.replace('<', '<')
71 | s1 = s1.replace('>', '>')
72 | return s1
73 |
74 | def quote_attrib(inStr):
75 | s1 = (isinstance(inStr, basestring) and inStr or
76 | '%s' % inStr)
77 | s1 = s1.replace('&', '&')
78 | s1 = s1.replace('<', '<')
79 | s1 = s1.replace('>', '>')
80 | if '"' in s1:
81 | if "'" in s1:
82 | s1 = '"%s"' % s1.replace('"', """)
83 | else:
84 | s1 = "'%s'" % s1
85 | else:
86 | s1 = '"%s"' % s1
87 | return s1
88 |
89 | def quote_python(inStr):
90 | s1 = inStr
91 | if s1.find("'") == -1:
92 | if s1.find('\n') == -1:
93 | return "'%s'" % s1
94 | else:
95 | return "'''%s'''" % s1
96 | else:
97 | if s1.find('"') != -1:
98 | s1 = s1.replace('"', '\\"')
99 | if s1.find('\n') == -1:
100 | return '"%s"' % s1
101 | else:
102 | return '"""%s"""' % s1
103 |
104 |
105 | class MixedContainer:
106 | # Constants for category:
107 | CategoryNone = 0
108 | CategoryText = 1
109 | CategorySimple = 2
110 | CategoryComplex = 3
111 | # Constants for content_type:
112 | TypeNone = 0
113 | TypeText = 1
114 | TypeString = 2
115 | TypeInteger = 3
116 | TypeFloat = 4
117 | TypeDecimal = 5
118 | TypeDouble = 6
119 | TypeBoolean = 7
120 | def __init__(self, category, content_type, name, value):
121 | self.category = category
122 | self.content_type = content_type
123 | self.name = name
124 | self.value = value
125 | def getCategory(self):
126 | return self.category
127 | def getContenttype(self, content_type):
128 | return self.content_type
129 | def getValue(self):
130 | return self.value
131 | def getName(self):
132 | return self.name
133 | def export(self, outfile, level, name, namespace):
134 | if self.category == MixedContainer.CategoryText:
135 | outfile.write(self.value)
136 | elif self.category == MixedContainer.CategorySimple:
137 | self.exportSimple(outfile, level, name)
138 | else: # category == MixedContainer.CategoryComplex
139 | self.value.export(outfile, level, namespace,name)
140 | def exportSimple(self, outfile, level, name):
141 | if self.content_type == MixedContainer.TypeString:
142 | outfile.write('<%s>%s%s>' % (self.name, self.value, self.name))
143 | elif self.content_type == MixedContainer.TypeInteger or \
144 | self.content_type == MixedContainer.TypeBoolean:
145 | outfile.write('<%s>%d%s>' % (self.name, self.value, self.name))
146 | elif self.content_type == MixedContainer.TypeFloat or \
147 | self.content_type == MixedContainer.TypeDecimal:
148 | outfile.write('<%s>%f%s>' % (self.name, self.value, self.name))
149 | elif self.content_type == MixedContainer.TypeDouble:
150 | outfile.write('<%s>%g%s>' % (self.name, self.value, self.name))
151 | def exportLiteral(self, outfile, level, name):
152 | if self.category == MixedContainer.CategoryText:
153 | showIndent(outfile, level)
154 | outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
155 | (self.category, self.content_type, self.name, self.value))
156 | elif self.category == MixedContainer.CategorySimple:
157 | showIndent(outfile, level)
158 | outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
159 | (self.category, self.content_type, self.name, self.value))
160 | else: # category == MixedContainer.CategoryComplex
161 | showIndent(outfile, level)
162 | outfile.write('MixedContainer(%d, %d, "%s",\n' % \
163 | (self.category, self.content_type, self.name,))
164 | self.value.exportLiteral(outfile, level + 1)
165 | showIndent(outfile, level)
166 | outfile.write(')\n')
167 |
168 |
169 | class _MemberSpec(object):
170 | def __init__(self, name='', data_type='', container=0):
171 | self.name = name
172 | self.data_type = data_type
173 | self.container = container
174 | def set_name(self, name): self.name = name
175 | def get_name(self): return self.name
176 | def set_data_type(self, data_type): self.data_type = data_type
177 | def get_data_type(self): return self.data_type
178 | def set_container(self, container): self.container = container
179 | def get_container(self): return self.container
180 |
181 |
182 | #
183 | # Data representation classes.
184 | #
185 |
186 | class DoxygenType(GeneratedsSuper):
187 | subclass = None
188 | superclass = None
189 | def __init__(self, version=None, compound=None):
190 | self.version = version
191 | if compound is None:
192 | self.compound = []
193 | else:
194 | self.compound = compound
195 | def factory(*args_, **kwargs_):
196 | if DoxygenType.subclass:
197 | return DoxygenType.subclass(*args_, **kwargs_)
198 | else:
199 | return DoxygenType(*args_, **kwargs_)
200 | factory = staticmethod(factory)
201 | def get_compound(self): return self.compound
202 | def set_compound(self, compound): self.compound = compound
203 | def add_compound(self, value): self.compound.append(value)
204 | def insert_compound(self, index, value): self.compound[index] = value
205 | def get_version(self): return self.version
206 | def set_version(self, version): self.version = version
207 | def export(self, outfile, level, namespace_='', name_='DoxygenType', namespacedef_=''):
208 | showIndent(outfile, level)
209 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
210 | self.exportAttributes(outfile, level, namespace_, name_='DoxygenType')
211 | if self.hasContent_():
212 | outfile.write('>\n')
213 | self.exportChildren(outfile, level + 1, namespace_, name_)
214 | showIndent(outfile, level)
215 | outfile.write('%s%s>\n' % (namespace_, name_))
216 | else:
217 | outfile.write(' />\n')
218 | def exportAttributes(self, outfile, level, namespace_='', name_='DoxygenType'):
219 | outfile.write(' version=%s' % (self.format_string(quote_attrib(self.version).encode(ExternalEncoding), input_name='version'), ))
220 | def exportChildren(self, outfile, level, namespace_='', name_='DoxygenType'):
221 | for compound_ in self.compound:
222 | compound_.export(outfile, level, namespace_, name_='compound')
223 | def hasContent_(self):
224 | if (
225 | self.compound is not None
226 | ):
227 | return True
228 | else:
229 | return False
230 | def exportLiteral(self, outfile, level, name_='DoxygenType'):
231 | level += 1
232 | self.exportLiteralAttributes(outfile, level, name_)
233 | if self.hasContent_():
234 | self.exportLiteralChildren(outfile, level, name_)
235 | def exportLiteralAttributes(self, outfile, level, name_):
236 | if self.version is not None:
237 | showIndent(outfile, level)
238 | outfile.write('version = %s,\n' % (self.version,))
239 | def exportLiteralChildren(self, outfile, level, name_):
240 | showIndent(outfile, level)
241 | outfile.write('compound=[\n')
242 | level += 1
243 | for compound in self.compound:
244 | showIndent(outfile, level)
245 | outfile.write('model_.compound(\n')
246 | compound.exportLiteral(outfile, level, name_='compound')
247 | showIndent(outfile, level)
248 | outfile.write('),\n')
249 | level -= 1
250 | showIndent(outfile, level)
251 | outfile.write('],\n')
252 | def build(self, node_):
253 | attrs = node_.attributes
254 | self.buildAttributes(attrs)
255 | for child_ in node_.childNodes:
256 | nodeName_ = child_.nodeName.split(':')[-1]
257 | self.buildChildren(child_, nodeName_)
258 | def buildAttributes(self, attrs):
259 | if attrs.get('version'):
260 | self.version = attrs.get('version').value
261 | def buildChildren(self, child_, nodeName_):
262 | if child_.nodeType == Node.ELEMENT_NODE and \
263 | nodeName_ == 'compound':
264 | obj_ = CompoundType.factory()
265 | obj_.build(child_)
266 | self.compound.append(obj_)
267 | # end class DoxygenType
268 |
269 |
270 | class CompoundType(GeneratedsSuper):
271 | subclass = None
272 | superclass = None
273 | def __init__(self, kind=None, refid=None, name=None, member=None):
274 | self.kind = kind
275 | self.refid = refid
276 | self.name = name
277 | if member is None:
278 | self.member = []
279 | else:
280 | self.member = member
281 | def factory(*args_, **kwargs_):
282 | if CompoundType.subclass:
283 | return CompoundType.subclass(*args_, **kwargs_)
284 | else:
285 | return CompoundType(*args_, **kwargs_)
286 | factory = staticmethod(factory)
287 | def get_name(self): return self.name
288 | def set_name(self, name): self.name = name
289 | def get_member(self): return self.member
290 | def set_member(self, member): self.member = member
291 | def add_member(self, value): self.member.append(value)
292 | def insert_member(self, index, value): self.member[index] = value
293 | def get_kind(self): return self.kind
294 | def set_kind(self, kind): self.kind = kind
295 | def get_refid(self): return self.refid
296 | def set_refid(self, refid): self.refid = refid
297 | def export(self, outfile, level, namespace_='', name_='CompoundType', namespacedef_=''):
298 | showIndent(outfile, level)
299 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
300 | self.exportAttributes(outfile, level, namespace_, name_='CompoundType')
301 | if self.hasContent_():
302 | outfile.write('>\n')
303 | self.exportChildren(outfile, level + 1, namespace_, name_)
304 | showIndent(outfile, level)
305 | outfile.write('%s%s>\n' % (namespace_, name_))
306 | else:
307 | outfile.write(' />\n')
308 | def exportAttributes(self, outfile, level, namespace_='', name_='CompoundType'):
309 | outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
310 | outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
311 | def exportChildren(self, outfile, level, namespace_='', name_='CompoundType'):
312 | if self.name is not None:
313 | showIndent(outfile, level)
314 | outfile.write('<%sname>%s%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
315 | for member_ in self.member:
316 | member_.export(outfile, level, namespace_, name_='member')
317 | def hasContent_(self):
318 | if (
319 | self.name is not None or
320 | self.member is not None
321 | ):
322 | return True
323 | else:
324 | return False
325 | def exportLiteral(self, outfile, level, name_='CompoundType'):
326 | level += 1
327 | self.exportLiteralAttributes(outfile, level, name_)
328 | if self.hasContent_():
329 | self.exportLiteralChildren(outfile, level, name_)
330 | def exportLiteralAttributes(self, outfile, level, name_):
331 | if self.kind is not None:
332 | showIndent(outfile, level)
333 | outfile.write('kind = "%s",\n' % (self.kind,))
334 | if self.refid is not None:
335 | showIndent(outfile, level)
336 | outfile.write('refid = %s,\n' % (self.refid,))
337 | def exportLiteralChildren(self, outfile, level, name_):
338 | showIndent(outfile, level)
339 | outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
340 | showIndent(outfile, level)
341 | outfile.write('member=[\n')
342 | level += 1
343 | for member in self.member:
344 | showIndent(outfile, level)
345 | outfile.write('model_.member(\n')
346 | member.exportLiteral(outfile, level, name_='member')
347 | showIndent(outfile, level)
348 | outfile.write('),\n')
349 | level -= 1
350 | showIndent(outfile, level)
351 | outfile.write('],\n')
352 | def build(self, node_):
353 | attrs = node_.attributes
354 | self.buildAttributes(attrs)
355 | for child_ in node_.childNodes:
356 | nodeName_ = child_.nodeName.split(':')[-1]
357 | self.buildChildren(child_, nodeName_)
358 | def buildAttributes(self, attrs):
359 | if attrs.get('kind'):
360 | self.kind = attrs.get('kind').value
361 | if attrs.get('refid'):
362 | self.refid = attrs.get('refid').value
363 | def buildChildren(self, child_, nodeName_):
364 | if child_.nodeType == Node.ELEMENT_NODE and \
365 | nodeName_ == 'name':
366 | name_ = ''
367 | for text__content_ in child_.childNodes:
368 | name_ += text__content_.nodeValue
369 | self.name = name_
370 | elif child_.nodeType == Node.ELEMENT_NODE and \
371 | nodeName_ == 'member':
372 | obj_ = MemberType.factory()
373 | obj_.build(child_)
374 | self.member.append(obj_)
375 | # end class CompoundType
376 |
377 |
378 | class MemberType(GeneratedsSuper):
379 | subclass = None
380 | superclass = None
381 | def __init__(self, kind=None, refid=None, name=None):
382 | self.kind = kind
383 | self.refid = refid
384 | self.name = name
385 | def factory(*args_, **kwargs_):
386 | if MemberType.subclass:
387 | return MemberType.subclass(*args_, **kwargs_)
388 | else:
389 | return MemberType(*args_, **kwargs_)
390 | factory = staticmethod(factory)
391 | def get_name(self): return self.name
392 | def set_name(self, name): self.name = name
393 | def get_kind(self): return self.kind
394 | def set_kind(self, kind): self.kind = kind
395 | def get_refid(self): return self.refid
396 | def set_refid(self, refid): self.refid = refid
397 | def export(self, outfile, level, namespace_='', name_='MemberType', namespacedef_=''):
398 | showIndent(outfile, level)
399 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
400 | self.exportAttributes(outfile, level, namespace_, name_='MemberType')
401 | if self.hasContent_():
402 | outfile.write('>\n')
403 | self.exportChildren(outfile, level + 1, namespace_, name_)
404 | showIndent(outfile, level)
405 | outfile.write('%s%s>\n' % (namespace_, name_))
406 | else:
407 | outfile.write(' />\n')
408 | def exportAttributes(self, outfile, level, namespace_='', name_='MemberType'):
409 | outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
410 | outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
411 | def exportChildren(self, outfile, level, namespace_='', name_='MemberType'):
412 | if self.name is not None:
413 | showIndent(outfile, level)
414 | outfile.write('<%sname>%s%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
415 | def hasContent_(self):
416 | if (
417 | self.name is not None
418 | ):
419 | return True
420 | else:
421 | return False
422 | def exportLiteral(self, outfile, level, name_='MemberType'):
423 | level += 1
424 | self.exportLiteralAttributes(outfile, level, name_)
425 | if self.hasContent_():
426 | self.exportLiteralChildren(outfile, level, name_)
427 | def exportLiteralAttributes(self, outfile, level, name_):
428 | if self.kind is not None:
429 | showIndent(outfile, level)
430 | outfile.write('kind = "%s",\n' % (self.kind,))
431 | if self.refid is not None:
432 | showIndent(outfile, level)
433 | outfile.write('refid = %s,\n' % (self.refid,))
434 | def exportLiteralChildren(self, outfile, level, name_):
435 | showIndent(outfile, level)
436 | outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
437 | def build(self, node_):
438 | attrs = node_.attributes
439 | self.buildAttributes(attrs)
440 | for child_ in node_.childNodes:
441 | nodeName_ = child_.nodeName.split(':')[-1]
442 | self.buildChildren(child_, nodeName_)
443 | def buildAttributes(self, attrs):
444 | if attrs.get('kind'):
445 | self.kind = attrs.get('kind').value
446 | if attrs.get('refid'):
447 | self.refid = attrs.get('refid').value
448 | def buildChildren(self, child_, nodeName_):
449 | if child_.nodeType == Node.ELEMENT_NODE and \
450 | nodeName_ == 'name':
451 | name_ = ''
452 | for text__content_ in child_.childNodes:
453 | name_ += text__content_.nodeValue
454 | self.name = name_
455 | # end class MemberType
456 |
457 |
458 | USAGE_TEXT = """
459 | Usage: python .py [ -s ]
460 | Options:
461 | -s Use the SAX parser, not the minidom parser.
462 | """
463 |
464 | def usage():
465 | print USAGE_TEXT
466 | sys.exit(1)
467 |
468 |
469 | def parse(inFileName):
470 | doc = minidom.parse(inFileName)
471 | rootNode = doc.documentElement
472 | rootObj = DoxygenType.factory()
473 | rootObj.build(rootNode)
474 | # Enable Python to collect the space used by the DOM.
475 | doc = None
476 | sys.stdout.write('\n')
477 | rootObj.export(sys.stdout, 0, name_="doxygenindex",
478 | namespacedef_='')
479 | return rootObj
480 |
481 |
482 | def parseString(inString):
483 | doc = minidom.parseString(inString)
484 | rootNode = doc.documentElement
485 | rootObj = DoxygenType.factory()
486 | rootObj.build(rootNode)
487 | # Enable Python to collect the space used by the DOM.
488 | doc = None
489 | sys.stdout.write('\n')
490 | rootObj.export(sys.stdout, 0, name_="doxygenindex",
491 | namespacedef_='')
492 | return rootObj
493 |
494 |
495 | def parseLiteral(inFileName):
496 | doc = minidom.parse(inFileName)
497 | rootNode = doc.documentElement
498 | rootObj = DoxygenType.factory()
499 | rootObj.build(rootNode)
500 | # Enable Python to collect the space used by the DOM.
501 | doc = None
502 | sys.stdout.write('from index import *\n\n')
503 | sys.stdout.write('rootObj = doxygenindex(\n')
504 | rootObj.exportLiteral(sys.stdout, 0, name_="doxygenindex")
505 | sys.stdout.write(')\n')
506 | return rootObj
507 |
508 |
509 | def main():
510 | args = sys.argv[1:]
511 | if len(args) == 1:
512 | parse(args[0])
513 | else:
514 | usage()
515 |
516 |
517 |
518 |
519 | if __name__ == '__main__':
520 | main()
521 | #import pdb
522 | #pdb.run('main()')
523 |
524 |
--------------------------------------------------------------------------------
/docs/doxygen/doxyxml/generated/compound.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """
4 | Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
5 | """
6 |
7 | from string import lower as str_lower
8 | from xml.dom import minidom
9 | from xml.dom import Node
10 |
11 | import sys
12 |
13 | import compoundsuper as supermod
14 | from compoundsuper import MixedContainer
15 |
16 |
17 | class DoxygenTypeSub(supermod.DoxygenType):
18 | def __init__(self, version=None, compounddef=None):
19 | supermod.DoxygenType.__init__(self, version, compounddef)
20 |
21 | def find(self, details):
22 |
23 | return self.compounddef.find(details)
24 |
25 | supermod.DoxygenType.subclass = DoxygenTypeSub
26 | # end class DoxygenTypeSub
27 |
28 |
29 | class compounddefTypeSub(supermod.compounddefType):
30 | def __init__(self, kind=None, prot=None, id=None, compoundname='', title='', basecompoundref=None, derivedcompoundref=None, includes=None, includedby=None, incdepgraph=None, invincdepgraph=None, innerdir=None, innerfile=None, innerclass=None, innernamespace=None, innerpage=None, innergroup=None, templateparamlist=None, sectiondef=None, briefdescription=None, detaileddescription=None, inheritancegraph=None, collaborationgraph=None, programlisting=None, location=None, listofallmembers=None):
31 | supermod.compounddefType.__init__(self, kind, prot, id, compoundname, title, basecompoundref, derivedcompoundref, includes, includedby, incdepgraph, invincdepgraph, innerdir, innerfile, innerclass, innernamespace, innerpage, innergroup, templateparamlist, sectiondef, briefdescription, detaileddescription, inheritancegraph, collaborationgraph, programlisting, location, listofallmembers)
32 |
33 | def find(self, details):
34 |
35 | if self.id == details.refid:
36 | return self
37 |
38 | for sectiondef in self.sectiondef:
39 | result = sectiondef.find(details)
40 | if result:
41 | return result
42 |
43 |
44 | supermod.compounddefType.subclass = compounddefTypeSub
45 | # end class compounddefTypeSub
46 |
47 |
48 | class listofallmembersTypeSub(supermod.listofallmembersType):
49 | def __init__(self, member=None):
50 | supermod.listofallmembersType.__init__(self, member)
51 | supermod.listofallmembersType.subclass = listofallmembersTypeSub
52 | # end class listofallmembersTypeSub
53 |
54 |
55 | class memberRefTypeSub(supermod.memberRefType):
56 | def __init__(self, virt=None, prot=None, refid=None, ambiguityscope=None, scope='', name=''):
57 | supermod.memberRefType.__init__(self, virt, prot, refid, ambiguityscope, scope, name)
58 | supermod.memberRefType.subclass = memberRefTypeSub
59 | # end class memberRefTypeSub
60 |
61 |
62 | class compoundRefTypeSub(supermod.compoundRefType):
63 | def __init__(self, virt=None, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
64 | supermod.compoundRefType.__init__(self, mixedclass_, content_)
65 | supermod.compoundRefType.subclass = compoundRefTypeSub
66 | # end class compoundRefTypeSub
67 |
68 |
69 | class reimplementTypeSub(supermod.reimplementType):
70 | def __init__(self, refid=None, valueOf_='', mixedclass_=None, content_=None):
71 | supermod.reimplementType.__init__(self, mixedclass_, content_)
72 | supermod.reimplementType.subclass = reimplementTypeSub
73 | # end class reimplementTypeSub
74 |
75 |
76 | class incTypeSub(supermod.incType):
77 | def __init__(self, local=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
78 | supermod.incType.__init__(self, mixedclass_, content_)
79 | supermod.incType.subclass = incTypeSub
80 | # end class incTypeSub
81 |
82 |
83 | class refTypeSub(supermod.refType):
84 | def __init__(self, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
85 | supermod.refType.__init__(self, mixedclass_, content_)
86 | supermod.refType.subclass = refTypeSub
87 | # end class refTypeSub
88 |
89 |
90 |
91 | class refTextTypeSub(supermod.refTextType):
92 | def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
93 | supermod.refTextType.__init__(self, mixedclass_, content_)
94 |
95 | supermod.refTextType.subclass = refTextTypeSub
96 | # end class refTextTypeSub
97 |
98 | class sectiondefTypeSub(supermod.sectiondefType):
99 |
100 |
101 | def __init__(self, kind=None, header='', description=None, memberdef=None):
102 | supermod.sectiondefType.__init__(self, kind, header, description, memberdef)
103 |
104 | def find(self, details):
105 |
106 | for memberdef in self.memberdef:
107 | if memberdef.id == details.refid:
108 | return memberdef
109 |
110 | return None
111 |
112 |
113 | supermod.sectiondefType.subclass = sectiondefTypeSub
114 | # end class sectiondefTypeSub
115 |
116 |
117 | class memberdefTypeSub(supermod.memberdefType):
118 | def __init__(self, initonly=None, kind=None, volatile=None, const=None, raise_=None, virt=None, readable=None, prot=None, explicit=None, new=None, final=None, writable=None, add=None, static=None, remove=None, sealed=None, mutable=None, gettable=None, inline=None, settable=None, id=None, templateparamlist=None, type_=None, definition='', argsstring='', name='', read='', write='', bitfield='', reimplements=None, reimplementedby=None, param=None, enumvalue=None, initializer=None, exceptions=None, briefdescription=None, detaileddescription=None, inbodydescription=None, location=None, references=None, referencedby=None):
119 | supermod.memberdefType.__init__(self, initonly, kind, volatile, const, raise_, virt, readable, prot, explicit, new, final, writable, add, static, remove, sealed, mutable, gettable, inline, settable, id, templateparamlist, type_, definition, argsstring, name, read, write, bitfield, reimplements, reimplementedby, param, enumvalue, initializer, exceptions, briefdescription, detaileddescription, inbodydescription, location, references, referencedby)
120 | supermod.memberdefType.subclass = memberdefTypeSub
121 | # end class memberdefTypeSub
122 |
123 |
124 | class descriptionTypeSub(supermod.descriptionType):
125 | def __init__(self, title='', para=None, sect1=None, internal=None, mixedclass_=None, content_=None):
126 | supermod.descriptionType.__init__(self, mixedclass_, content_)
127 | supermod.descriptionType.subclass = descriptionTypeSub
128 | # end class descriptionTypeSub
129 |
130 |
131 | class enumvalueTypeSub(supermod.enumvalueType):
132 | def __init__(self, prot=None, id=None, name='', initializer=None, briefdescription=None, detaileddescription=None, mixedclass_=None, content_=None):
133 | supermod.enumvalueType.__init__(self, mixedclass_, content_)
134 | supermod.enumvalueType.subclass = enumvalueTypeSub
135 | # end class enumvalueTypeSub
136 |
137 |
138 | class templateparamlistTypeSub(supermod.templateparamlistType):
139 | def __init__(self, param=None):
140 | supermod.templateparamlistType.__init__(self, param)
141 | supermod.templateparamlistType.subclass = templateparamlistTypeSub
142 | # end class templateparamlistTypeSub
143 |
144 |
145 | class paramTypeSub(supermod.paramType):
146 | def __init__(self, type_=None, declname='', defname='', array='', defval=None, briefdescription=None):
147 | supermod.paramType.__init__(self, type_, declname, defname, array, defval, briefdescription)
148 | supermod.paramType.subclass = paramTypeSub
149 | # end class paramTypeSub
150 |
151 |
152 | class linkedTextTypeSub(supermod.linkedTextType):
153 | def __init__(self, ref=None, mixedclass_=None, content_=None):
154 | supermod.linkedTextType.__init__(self, mixedclass_, content_)
155 | supermod.linkedTextType.subclass = linkedTextTypeSub
156 | # end class linkedTextTypeSub
157 |
158 |
159 | class graphTypeSub(supermod.graphType):
160 | def __init__(self, node=None):
161 | supermod.graphType.__init__(self, node)
162 | supermod.graphType.subclass = graphTypeSub
163 | # end class graphTypeSub
164 |
165 |
166 | class nodeTypeSub(supermod.nodeType):
167 | def __init__(self, id=None, label='', link=None, childnode=None):
168 | supermod.nodeType.__init__(self, id, label, link, childnode)
169 | supermod.nodeType.subclass = nodeTypeSub
170 | # end class nodeTypeSub
171 |
172 |
173 | class childnodeTypeSub(supermod.childnodeType):
174 | def __init__(self, relation=None, refid=None, edgelabel=None):
175 | supermod.childnodeType.__init__(self, relation, refid, edgelabel)
176 | supermod.childnodeType.subclass = childnodeTypeSub
177 | # end class childnodeTypeSub
178 |
179 |
180 | class linkTypeSub(supermod.linkType):
181 | def __init__(self, refid=None, external=None, valueOf_=''):
182 | supermod.linkType.__init__(self, refid, external)
183 | supermod.linkType.subclass = linkTypeSub
184 | # end class linkTypeSub
185 |
186 |
187 | class listingTypeSub(supermod.listingType):
188 | def __init__(self, codeline=None):
189 | supermod.listingType.__init__(self, codeline)
190 | supermod.listingType.subclass = listingTypeSub
191 | # end class listingTypeSub
192 |
193 |
194 | class codelineTypeSub(supermod.codelineType):
195 | def __init__(self, external=None, lineno=None, refkind=None, refid=None, highlight=None):
196 | supermod.codelineType.__init__(self, external, lineno, refkind, refid, highlight)
197 | supermod.codelineType.subclass = codelineTypeSub
198 | # end class codelineTypeSub
199 |
200 |
201 | class highlightTypeSub(supermod.highlightType):
202 | def __init__(self, class_=None, sp=None, ref=None, mixedclass_=None, content_=None):
203 | supermod.highlightType.__init__(self, mixedclass_, content_)
204 | supermod.highlightType.subclass = highlightTypeSub
205 | # end class highlightTypeSub
206 |
207 |
208 | class referenceTypeSub(supermod.referenceType):
209 | def __init__(self, endline=None, startline=None, refid=None, compoundref=None, valueOf_='', mixedclass_=None, content_=None):
210 | supermod.referenceType.__init__(self, mixedclass_, content_)
211 | supermod.referenceType.subclass = referenceTypeSub
212 | # end class referenceTypeSub
213 |
214 |
215 | class locationTypeSub(supermod.locationType):
216 | def __init__(self, bodystart=None, line=None, bodyend=None, bodyfile=None, file=None, valueOf_=''):
217 | supermod.locationType.__init__(self, bodystart, line, bodyend, bodyfile, file)
218 | supermod.locationType.subclass = locationTypeSub
219 | # end class locationTypeSub
220 |
221 |
222 | class docSect1TypeSub(supermod.docSect1Type):
223 | def __init__(self, id=None, title='', para=None, sect2=None, internal=None, mixedclass_=None, content_=None):
224 | supermod.docSect1Type.__init__(self, mixedclass_, content_)
225 | supermod.docSect1Type.subclass = docSect1TypeSub
226 | # end class docSect1TypeSub
227 |
228 |
229 | class docSect2TypeSub(supermod.docSect2Type):
230 | def __init__(self, id=None, title='', para=None, sect3=None, internal=None, mixedclass_=None, content_=None):
231 | supermod.docSect2Type.__init__(self, mixedclass_, content_)
232 | supermod.docSect2Type.subclass = docSect2TypeSub
233 | # end class docSect2TypeSub
234 |
235 |
236 | class docSect3TypeSub(supermod.docSect3Type):
237 | def __init__(self, id=None, title='', para=None, sect4=None, internal=None, mixedclass_=None, content_=None):
238 | supermod.docSect3Type.__init__(self, mixedclass_, content_)
239 | supermod.docSect3Type.subclass = docSect3TypeSub
240 | # end class docSect3TypeSub
241 |
242 |
243 | class docSect4TypeSub(supermod.docSect4Type):
244 | def __init__(self, id=None, title='', para=None, internal=None, mixedclass_=None, content_=None):
245 | supermod.docSect4Type.__init__(self, mixedclass_, content_)
246 | supermod.docSect4Type.subclass = docSect4TypeSub
247 | # end class docSect4TypeSub
248 |
249 |
250 | class docInternalTypeSub(supermod.docInternalType):
251 | def __init__(self, para=None, sect1=None, mixedclass_=None, content_=None):
252 | supermod.docInternalType.__init__(self, mixedclass_, content_)
253 | supermod.docInternalType.subclass = docInternalTypeSub
254 | # end class docInternalTypeSub
255 |
256 |
257 | class docInternalS1TypeSub(supermod.docInternalS1Type):
258 | def __init__(self, para=None, sect2=None, mixedclass_=None, content_=None):
259 | supermod.docInternalS1Type.__init__(self, mixedclass_, content_)
260 | supermod.docInternalS1Type.subclass = docInternalS1TypeSub
261 | # end class docInternalS1TypeSub
262 |
263 |
264 | class docInternalS2TypeSub(supermod.docInternalS2Type):
265 | def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
266 | supermod.docInternalS2Type.__init__(self, mixedclass_, content_)
267 | supermod.docInternalS2Type.subclass = docInternalS2TypeSub
268 | # end class docInternalS2TypeSub
269 |
270 |
271 | class docInternalS3TypeSub(supermod.docInternalS3Type):
272 | def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
273 | supermod.docInternalS3Type.__init__(self, mixedclass_, content_)
274 | supermod.docInternalS3Type.subclass = docInternalS3TypeSub
275 | # end class docInternalS3TypeSub
276 |
277 |
278 | class docInternalS4TypeSub(supermod.docInternalS4Type):
279 | def __init__(self, para=None, mixedclass_=None, content_=None):
280 | supermod.docInternalS4Type.__init__(self, mixedclass_, content_)
281 | supermod.docInternalS4Type.subclass = docInternalS4TypeSub
282 | # end class docInternalS4TypeSub
283 |
284 |
285 | class docURLLinkSub(supermod.docURLLink):
286 | def __init__(self, url=None, valueOf_='', mixedclass_=None, content_=None):
287 | supermod.docURLLink.__init__(self, mixedclass_, content_)
288 | supermod.docURLLink.subclass = docURLLinkSub
289 | # end class docURLLinkSub
290 |
291 |
292 | class docAnchorTypeSub(supermod.docAnchorType):
293 | def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
294 | supermod.docAnchorType.__init__(self, mixedclass_, content_)
295 | supermod.docAnchorType.subclass = docAnchorTypeSub
296 | # end class docAnchorTypeSub
297 |
298 |
299 | class docFormulaTypeSub(supermod.docFormulaType):
300 | def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
301 | supermod.docFormulaType.__init__(self, mixedclass_, content_)
302 | supermod.docFormulaType.subclass = docFormulaTypeSub
303 | # end class docFormulaTypeSub
304 |
305 |
306 | class docIndexEntryTypeSub(supermod.docIndexEntryType):
307 | def __init__(self, primaryie='', secondaryie=''):
308 | supermod.docIndexEntryType.__init__(self, primaryie, secondaryie)
309 | supermod.docIndexEntryType.subclass = docIndexEntryTypeSub
310 | # end class docIndexEntryTypeSub
311 |
312 |
313 | class docListTypeSub(supermod.docListType):
314 | def __init__(self, listitem=None):
315 | supermod.docListType.__init__(self, listitem)
316 | supermod.docListType.subclass = docListTypeSub
317 | # end class docListTypeSub
318 |
319 |
320 | class docListItemTypeSub(supermod.docListItemType):
321 | def __init__(self, para=None):
322 | supermod.docListItemType.__init__(self, para)
323 | supermod.docListItemType.subclass = docListItemTypeSub
324 | # end class docListItemTypeSub
325 |
326 |
327 | class docSimpleSectTypeSub(supermod.docSimpleSectType):
328 | def __init__(self, kind=None, title=None, para=None):
329 | supermod.docSimpleSectType.__init__(self, kind, title, para)
330 | supermod.docSimpleSectType.subclass = docSimpleSectTypeSub
331 | # end class docSimpleSectTypeSub
332 |
333 |
334 | class docVarListEntryTypeSub(supermod.docVarListEntryType):
335 | def __init__(self, term=None):
336 | supermod.docVarListEntryType.__init__(self, term)
337 | supermod.docVarListEntryType.subclass = docVarListEntryTypeSub
338 | # end class docVarListEntryTypeSub
339 |
340 |
341 | class docRefTextTypeSub(supermod.docRefTextType):
342 | def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
343 | supermod.docRefTextType.__init__(self, mixedclass_, content_)
344 | supermod.docRefTextType.subclass = docRefTextTypeSub
345 | # end class docRefTextTypeSub
346 |
347 |
348 | class docTableTypeSub(supermod.docTableType):
349 | def __init__(self, rows=None, cols=None, row=None, caption=None):
350 | supermod.docTableType.__init__(self, rows, cols, row, caption)
351 | supermod.docTableType.subclass = docTableTypeSub
352 | # end class docTableTypeSub
353 |
354 |
355 | class docRowTypeSub(supermod.docRowType):
356 | def __init__(self, entry=None):
357 | supermod.docRowType.__init__(self, entry)
358 | supermod.docRowType.subclass = docRowTypeSub
359 | # end class docRowTypeSub
360 |
361 |
362 | class docEntryTypeSub(supermod.docEntryType):
363 | def __init__(self, thead=None, para=None):
364 | supermod.docEntryType.__init__(self, thead, para)
365 | supermod.docEntryType.subclass = docEntryTypeSub
366 | # end class docEntryTypeSub
367 |
368 |
369 | class docHeadingTypeSub(supermod.docHeadingType):
370 | def __init__(self, level=None, valueOf_='', mixedclass_=None, content_=None):
371 | supermod.docHeadingType.__init__(self, mixedclass_, content_)
372 | supermod.docHeadingType.subclass = docHeadingTypeSub
373 | # end class docHeadingTypeSub
374 |
375 |
376 | class docImageTypeSub(supermod.docImageType):
377 | def __init__(self, width=None, type_=None, name=None, height=None, valueOf_='', mixedclass_=None, content_=None):
378 | supermod.docImageType.__init__(self, mixedclass_, content_)
379 | supermod.docImageType.subclass = docImageTypeSub
380 | # end class docImageTypeSub
381 |
382 |
383 | class docDotFileTypeSub(supermod.docDotFileType):
384 | def __init__(self, name=None, valueOf_='', mixedclass_=None, content_=None):
385 | supermod.docDotFileType.__init__(self, mixedclass_, content_)
386 | supermod.docDotFileType.subclass = docDotFileTypeSub
387 | # end class docDotFileTypeSub
388 |
389 |
390 | class docTocItemTypeSub(supermod.docTocItemType):
391 | def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
392 | supermod.docTocItemType.__init__(self, mixedclass_, content_)
393 | supermod.docTocItemType.subclass = docTocItemTypeSub
394 | # end class docTocItemTypeSub
395 |
396 |
397 | class docTocListTypeSub(supermod.docTocListType):
398 | def __init__(self, tocitem=None):
399 | supermod.docTocListType.__init__(self, tocitem)
400 | supermod.docTocListType.subclass = docTocListTypeSub
401 | # end class docTocListTypeSub
402 |
403 |
404 | class docLanguageTypeSub(supermod.docLanguageType):
405 | def __init__(self, langid=None, para=None):
406 | supermod.docLanguageType.__init__(self, langid, para)
407 | supermod.docLanguageType.subclass = docLanguageTypeSub
408 | # end class docLanguageTypeSub
409 |
410 |
411 | class docParamListTypeSub(supermod.docParamListType):
412 | def __init__(self, kind=None, parameteritem=None):
413 | supermod.docParamListType.__init__(self, kind, parameteritem)
414 | supermod.docParamListType.subclass = docParamListTypeSub
415 | # end class docParamListTypeSub
416 |
417 |
418 | class docParamListItemSub(supermod.docParamListItem):
419 | def __init__(self, parameternamelist=None, parameterdescription=None):
420 | supermod.docParamListItem.__init__(self, parameternamelist, parameterdescription)
421 | supermod.docParamListItem.subclass = docParamListItemSub
422 | # end class docParamListItemSub
423 |
424 |
425 | class docParamNameListSub(supermod.docParamNameList):
426 | def __init__(self, parametername=None):
427 | supermod.docParamNameList.__init__(self, parametername)
428 | supermod.docParamNameList.subclass = docParamNameListSub
429 | # end class docParamNameListSub
430 |
431 |
432 | class docParamNameSub(supermod.docParamName):
433 | def __init__(self, direction=None, ref=None, mixedclass_=None, content_=None):
434 | supermod.docParamName.__init__(self, mixedclass_, content_)
435 | supermod.docParamName.subclass = docParamNameSub
436 | # end class docParamNameSub
437 |
438 |
439 | class docXRefSectTypeSub(supermod.docXRefSectType):
440 | def __init__(self, id=None, xreftitle=None, xrefdescription=None):
441 | supermod.docXRefSectType.__init__(self, id, xreftitle, xrefdescription)
442 | supermod.docXRefSectType.subclass = docXRefSectTypeSub
443 | # end class docXRefSectTypeSub
444 |
445 |
446 | class docCopyTypeSub(supermod.docCopyType):
447 | def __init__(self, link=None, para=None, sect1=None, internal=None):
448 | supermod.docCopyType.__init__(self, link, para, sect1, internal)
449 | supermod.docCopyType.subclass = docCopyTypeSub
450 | # end class docCopyTypeSub
451 |
452 |
453 | class docCharTypeSub(supermod.docCharType):
454 | def __init__(self, char=None, valueOf_=''):
455 | supermod.docCharType.__init__(self, char)
456 | supermod.docCharType.subclass = docCharTypeSub
457 | # end class docCharTypeSub
458 |
459 | class docParaTypeSub(supermod.docParaType):
460 | def __init__(self, char=None, valueOf_=''):
461 | supermod.docParaType.__init__(self, char)
462 |
463 | self.parameterlist = []
464 | self.simplesects = []
465 | self.content = []
466 |
467 | def buildChildren(self, child_, nodeName_):
468 | supermod.docParaType.buildChildren(self, child_, nodeName_)
469 |
470 | if child_.nodeType == Node.TEXT_NODE:
471 | obj_ = self.mixedclass_(MixedContainer.CategoryText,
472 | MixedContainer.TypeNone, '', child_.nodeValue)
473 | self.content.append(obj_)
474 | elif child_.nodeType == Node.ELEMENT_NODE and \
475 | nodeName_ == "ref":
476 | obj_ = supermod.docRefTextType.factory()
477 | obj_.build(child_)
478 | self.content.append(obj_)
479 | elif child_.nodeType == Node.ELEMENT_NODE and \
480 | nodeName_ == 'parameterlist':
481 | obj_ = supermod.docParamListType.factory()
482 | obj_.build(child_)
483 | self.parameterlist.append(obj_)
484 | elif child_.nodeType == Node.ELEMENT_NODE and \
485 | nodeName_ == 'simplesect':
486 | obj_ = supermod.docSimpleSectType.factory()
487 | obj_.build(child_)
488 | self.simplesects.append(obj_)
489 |
490 |
491 | supermod.docParaType.subclass = docParaTypeSub
492 | # end class docParaTypeSub
493 |
494 |
495 |
496 | def parse(inFilename):
497 | doc = minidom.parse(inFilename)
498 | rootNode = doc.documentElement
499 | rootObj = supermod.DoxygenType.factory()
500 | rootObj.build(rootNode)
501 | return rootObj
502 |
503 |
504 |
--------------------------------------------------------------------------------