Compare commits
186 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bab0177d13 | |||
| 86965650ae | |||
| ef5fd6c595 | |||
| 6b5a8c1ddc | |||
| 4d1befbc05 | |||
| 24f72aaf08 | |||
| e620d48c81 | |||
| 4f069d6518 | |||
| 3d8a172acc | |||
| a2491b5474 | |||
| 5f7e102e3d | |||
| 6cd3b5bd10 | |||
| 4d12149cfb | |||
| 7e3107282a | |||
| 51f7d6b284 | |||
| 45fd47b6ec | |||
| 844424404d | |||
| 228d1b1bcc | |||
| 4a3f387d6d | |||
| 0b095e0ff7 | |||
| 8ca5dcedde | |||
| d8f45138a2 | |||
| e2a59771ed | |||
| 002df040ff | |||
| 0f659b4d50 | |||
| ae1286a727 | |||
| 7a2cbdb8d8 | |||
| d63adab8f1 | |||
| 99f1a4564f | |||
| c3e8688859 | |||
| 4f034c9722 | |||
| 763d55d9f2 | |||
| a17bd7bf3a | |||
| f66f1eea8a | |||
| 14d8dfcb5d | |||
| eea1ffa3bc | |||
| 30be96a165 | |||
| 9393abbf65 | |||
| 39861c37af | |||
| 8bffcf7faf | |||
| 358bb5ccaa | |||
| fee31310e5 | |||
| c80340df6e | |||
| 5c7879feaf | |||
| 4555253ab9 | |||
| 3ccf528a96 | |||
| b8b91a0c88 | |||
| f956d36ce4 | |||
| 3143469287 | |||
| 4cddc2b740 | |||
| d730126586 | |||
| b83d008fc8 | |||
| 08787e1ddb | |||
| 5827b77c19 | |||
| be0e79d41b | |||
| e8922f3e3a | |||
| 0d5c8c60c7 | |||
| e07d85547d | |||
| 2d3201c7a1 | |||
| 333999630d | |||
| 54ef06a167 | |||
| 1624842801 | |||
| 872b2dd0af | |||
| df0d480c59 | |||
| 26a0c2c87e | |||
| d90b28c55b | |||
| 6dc42c7f43 | |||
| fc429e7f17 | |||
| 44561c1578 | |||
| d1667da2d4 | |||
| 951d8fd547 | |||
| 7b119ba59e | |||
| 21bcc8b639 | |||
| 144cbbf796 | |||
| 691cf04a8f | |||
| 429647eff1 | |||
| 1dcdcce729 | |||
| 528536e3f2 | |||
| 9cf628359b | |||
| c6502ae022 | |||
| d96ffc6ec8 | |||
| 0f5215d921 | |||
| 22f761d7d0 | |||
| 4a1bd44033 | |||
| 65ec683d8e | |||
| f7365d081a | |||
| 5bed2d13e6 | |||
| 3523807c09 | |||
| 1ef58db9c6 | |||
| 84c9ff3e0d | |||
| 6f5faecabd | |||
| 285a0e2558 | |||
| c1d50c7ff2 | |||
| 0bd2e30f55 | |||
| 8530b92086 | |||
| 26514acfef | |||
| 95b4798c6b | |||
| 743504ccdd | |||
| fff13b2443 | |||
| 88e17d6176 | |||
| bef6e3d962 | |||
| da1b0eb713 | |||
| 23a195311a | |||
| 43abd875d9 | |||
| c1fde325a5 | |||
| baa5b07152 | |||
| f543a8598c | |||
| ba50c10a02 | |||
| 68158e14f7 | |||
| 58b3ffb94d | |||
| d16559b105 | |||
| c3195613ba | |||
| cc0a56e341 | |||
| 5ddba507e5 | |||
| 397e9faaaa | |||
| 30862c0ff8 | |||
| 0b833da040 | |||
| c05497dc19 | |||
| ece3cbf5bb | |||
| c3291917c8 | |||
| d1d33c90eb | |||
| 1ed08f6e9a | |||
| dd89949184 | |||
| 9ca1f310f5 | |||
| aa8d43508e | |||
| 052d5022b0 | |||
| 5a9846fa67 | |||
| 6bcf462aa5 | |||
| 325c0400d2 | |||
| 4c710aec25 | |||
| 7f95f47ec6 | |||
| f9aa4b5ec2 | |||
| 760fc86101 | |||
| 0f56254df3 | |||
| 74ae445143 | |||
| 3703abbbf1 | |||
| fb14006c4b | |||
| b16ac24359 | |||
| e815faa792 | |||
| 298d9823cc | |||
| 17abd32ca9 | |||
| 9d593483bf | |||
| 4a43c572b3 | |||
| 253c26c48f | |||
| ae168184bc | |||
| 566de26230 | |||
| 01d40ec00b | |||
| 0e11d51b01 | |||
| 77ed9e84c2 | |||
| 3ae290ec87 | |||
| 72d089d9cc | |||
| a47ae95ce5 | |||
| b781cea7eb | |||
| 81ff17ccd5 | |||
| 246c394658 | |||
| 676963604f | |||
| 3ba472ab7c | |||
| 2853ddaa00 | |||
| a42e59c5b9 | |||
| fd64759c5a | |||
| 39017c8b20 | |||
| a812150eac | |||
| 016616d915 | |||
| 9176a3d615 | |||
| 7e793f0d5b | |||
| 9b7c568868 | |||
| c0fab12da3 | |||
| 66ab958b6e | |||
| 940a1a1ccf | |||
| 39db4c91e8 | |||
| 06c2e09234 | |||
| 6148463e61 | |||
| 63dc634cc4 | |||
| 7eae9a9bf9 | |||
| 12f2b0e913 | |||
| d1d6ed6010 | |||
| 481d873f2e | |||
| 009490b8c9 | |||
| 33a75673b2 | |||
| 6fb8a97cfd | |||
| 1eb5ac46ef | |||
| 77548c73a9 | |||
| 9ba6e4af39 | |||
| 2841634b1c | |||
| b3442dad46 | |||
| 123628146e |
+104
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: LLVM
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlinesLeft: true
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 90
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^"(gnuradio)/'
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<(gnuradio)/'
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<(boost)/'
|
||||||
|
Priority: 98
|
||||||
|
- Regex: '^<[a-z]*>$'
|
||||||
|
Priority: 99
|
||||||
|
- Regex: '^".*"$'
|
||||||
|
Priority: 0
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 10
|
||||||
|
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 2
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: 8
|
||||||
|
UseTab: Never
|
||||||
@@ -5,3 +5,5 @@ examples/*.py
|
|||||||
.pydevproject
|
.pydevproject
|
||||||
.settings
|
.settings
|
||||||
*.pyc
|
*.pyc
|
||||||
|
**/.DS_Store
|
||||||
|
.clang_complete
|
||||||
|
|||||||
+56
-83
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright 2013 Free Software Foundation, Inc.
|
# This file is a part of gr-ieee802-11
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,92 +17,85 @@
|
|||||||
########################################################################
|
########################################################################
|
||||||
# Project setup
|
# Project setup
|
||||||
########################################################################
|
########################################################################
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
project(gr-ieee802-11 CXX C)
|
project(gr-ieee802-11 CXX C)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
#select the release build type by default to get optimization flags
|
# Install to PyBOMBS target prefix if defined
|
||||||
|
if(DEFINED ENV{PYBOMBS_PREFIX})
|
||||||
|
set(CMAKE_INSTALL_PREFIX $ENV{PYBOMBS_PREFIX})
|
||||||
|
message(STATUS "PyBOMBS installed GNU Radio. Setting CMAKE_INSTALL_PREFIX to $ENV{PYBOMBS_PREFIX}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Select the release build type by default to get optimization flags
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
set(CMAKE_BUILD_TYPE "Release")
|
set(CMAKE_BUILD_TYPE "Release")
|
||||||
message(STATUS "Build type not specified: defaulting to release.")
|
message(STATUS "Build type not specified: defaulting to release.")
|
||||||
endif(NOT CMAKE_BUILD_TYPE)
|
endif(NOT CMAKE_BUILD_TYPE)
|
||||||
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
||||||
|
|
||||||
|
# Make sure our local CMake Modules path comes first
|
||||||
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||||
|
|
||||||
|
# Set the version information here
|
||||||
|
set(VERSION_MAJOR 1)
|
||||||
|
set(VERSION_API 1)
|
||||||
|
set(VERSION_ABI 0)
|
||||||
|
set(VERSION_PATCH git)
|
||||||
|
|
||||||
|
cmake_policy(SET CMP0011 NEW)
|
||||||
|
|
||||||
|
# Enable generation of compile_commands.json for code completion engines
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Compiler specific setup
|
# Compiler specific setup
|
||||||
########################################################################
|
########################################################################
|
||||||
if(NOT WIN32)
|
if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
|
||||||
|
CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
AND NOT WIN32)
|
||||||
#http://gcc.gnu.org/wiki/Visibility
|
#http://gcc.gnu.org/wiki/Visibility
|
||||||
add_definitions(-fvisibility=hidden)
|
add_definitions(-fvisibility=hidden)
|
||||||
add_definitions(-std=c++0x)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
########################################################################
|
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
# Find boost
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
########################################################################
|
ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
if(UNIX AND EXISTS "/usr/lib64")
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
|
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
endif(UNIX AND EXISTS "/usr/lib64")
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
set(Boost_ADDITIONAL_VERSIONS
|
ELSE()
|
||||||
"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"
|
message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
|
||||||
"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"
|
ENDIF()
|
||||||
"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"
|
|
||||||
"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"
|
|
||||||
"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"
|
|
||||||
"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"
|
|
||||||
"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"
|
|
||||||
)
|
|
||||||
find_package(Boost "1.35" COMPONENTS filesystem system)
|
|
||||||
|
|
||||||
if(NOT Boost_FOUND)
|
IF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
message(FATAL_ERROR "Boost required to compile ieee802-11")
|
SET(CMAKE_C_STANDARD 11)
|
||||||
endif()
|
ELSEIF(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
SET(CMAKE_C_STANDARD 11)
|
||||||
|
ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
SET(CMAKE_C_STANDARD 11)
|
||||||
|
ELSE()
|
||||||
|
message(WARNING "C standard could not be set because compiler is not GNU, Clang or MSVC.")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install directories
|
# Install directories
|
||||||
########################################################################
|
########################################################################
|
||||||
|
find_package(Gnuradio "3.8" REQUIRED COMPONENTS filter fft digital analog blocks)
|
||||||
|
include(GrVersion)
|
||||||
|
|
||||||
include(GrPlatform) #define LIB_SUFFIX
|
include(GrPlatform) #define LIB_SUFFIX
|
||||||
set(GR_RUNTIME_DIR bin)
|
|
||||||
set(GR_LIBRARY_DIR lib${LIB_SUFFIX})
|
if(NOT CMAKE_MODULES_DIR)
|
||||||
set(GR_INCLUDE_DIR include/ieee802-11)
|
set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
|
||||||
set(GR_DATA_DIR share)
|
endif(NOT CMAKE_MODULES_DIR)
|
||||||
|
|
||||||
|
set(GR_INCLUDE_DIR include/ieee802_11)
|
||||||
|
set(GR_CMAKE_DIR ${CMAKE_MODULES_DIR}/ieee802_11)
|
||||||
set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
|
set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
set(GR_DOC_DIR ${GR_DATA_DIR}/doc)
|
|
||||||
set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
|
set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
set(GR_CONF_DIR etc)
|
|
||||||
set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
|
set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
|
||||||
set(GR_LIBEXEC_DIR libexec)
|
|
||||||
set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
|
set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
|
||||||
set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Find gnuradio build dependencies
|
|
||||||
########################################################################
|
|
||||||
set(GR_REQUIRED_COMPONENTS RUNTIME FILTER FFT PMT DIGITAL)
|
|
||||||
find_package(Gnuradio)
|
|
||||||
find_package(CppUnit)
|
|
||||||
find_package(ITPP)
|
|
||||||
|
|
||||||
if(NOT GNURADIO_RUNTIME_FOUND)
|
|
||||||
message(FATAL_ERROR "GnuRadio Runtime required to compile ieee802-11")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CPPUNIT_FOUND)
|
|
||||||
message(FATAL_ERROR "CppUnit required to compile ieee802-11")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT ITPP_FOUND)
|
|
||||||
message(FATAL_ERROR "ITPP required to compile ieee802-11")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup logging options
|
|
||||||
########################################################################
|
|
||||||
|
|
||||||
include(GrMiscUtils)
|
|
||||||
GR_LOGGING()
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# On Apple only, set install name and use rpath correctly, if not already set
|
# On Apple only, set install name and use rpath correctly, if not already set
|
||||||
@@ -114,7 +107,7 @@ if(APPLE)
|
|||||||
PATH "Library Install Name Destination Directory" FORCE)
|
PATH "Library Install Name Destination Directory" FORCE)
|
||||||
endif(NOT CMAKE_INSTALL_NAME_DIR)
|
endif(NOT CMAKE_INSTALL_NAME_DIR)
|
||||||
if(NOT CMAKE_INSTALL_RPATH)
|
if(NOT CMAKE_INSTALL_RPATH)
|
||||||
set(cmakE_INSTALL_RPATH
|
set(CMAKE_INSTALL_RPATH
|
||||||
${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
|
${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE
|
||||||
PATH "Library Install RPath" FORCE)
|
PATH "Library Install RPath" FORCE)
|
||||||
endif(NOT CMAKE_INSTALL_RPATH)
|
endif(NOT CMAKE_INSTALL_RPATH)
|
||||||
@@ -124,27 +117,6 @@ if(APPLE)
|
|||||||
endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup the include and linker paths
|
|
||||||
########################################################################
|
|
||||||
include_directories(
|
|
||||||
${CMAKE_SOURCE_DIR}/include
|
|
||||||
${CMAKE_SOURCE_DIR}/lib
|
|
||||||
${CMAKE_BINARY_DIR}/include
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
${CPPUNIT_INCLUDE_DIRS}
|
|
||||||
${ITPP_INCLUDE_DIR}
|
|
||||||
${GNURADIO_RUNTIME_INCLUDE_DIRS}
|
|
||||||
${LOG4CPP_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
link_directories(
|
|
||||||
${Boost_LIBRARY_DIRS}
|
|
||||||
${CPPUNIT_LIBRARY_DIRS}
|
|
||||||
${GNURADIO_RUNTIME_LIBRARY_DIRS}
|
|
||||||
${LOG4CPP_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Create uninstall target
|
# Create uninstall target
|
||||||
########################################################################
|
########################################################################
|
||||||
@@ -155,12 +127,13 @@ configure_file(
|
|||||||
|
|
||||||
add_custom_target(uninstall
|
add_custom_target(uninstall
|
||||||
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Add subdirectories
|
# Add subdirectories
|
||||||
########################################################################
|
########################################################################
|
||||||
add_subdirectory(include/ieee802-11)
|
add_subdirectory(include/ieee802_11)
|
||||||
add_subdirectory(lib)
|
add_subdirectory(lib)
|
||||||
add_subdirectory(swig)
|
add_subdirectory(swig)
|
||||||
add_subdirectory(python)
|
add_subdirectory(python)
|
||||||
|
|||||||
+7
-8
@@ -1,17 +1,16 @@
|
|||||||
title: gr-ieee802-11
|
title: gr-ieee802-11
|
||||||
author:
|
brief: IEEE 802.11 a/g/p Transceiver
|
||||||
- Bastian Bloessl <bloessl@ccs-labs.org>
|
|
||||||
copyright_owner:
|
|
||||||
- Bastian Bloessl
|
|
||||||
dependencies:
|
|
||||||
- gnuradio (>= 3.7.4)
|
|
||||||
repo: https://github.com/bastibl/gr-ieee802-11.git
|
|
||||||
tags:
|
tags:
|
||||||
- IEEE 802.11
|
- IEEE 802.11
|
||||||
- WiFi
|
- WiFi
|
||||||
- OFDM
|
- OFDM
|
||||||
|
author:
|
||||||
|
- Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
copyright_owner:
|
||||||
|
- Bastian Bloessl
|
||||||
|
repo: https://github.com/bastibl/gr-ieee802-11.git
|
||||||
website: http://www.ccs-labs.org/projects/wime/
|
website: http://www.ccs-labs.org/projects/wime/
|
||||||
brief: IEEE 802.11 a/g/p Transceiver
|
|
||||||
icon: http://www.ccs-labs.org/projects/wime/wime.png
|
icon: http://www.ccs-labs.org/projects/wime/wime.png
|
||||||
|
gr_supported_version: v3.7, v3.8, v3.9
|
||||||
---
|
---
|
||||||
This an IEEE 802.11 a/g/p transceiver for GNU Radio v3.7. Over the air, I tested it with the Ettus USRP N210 with XCVR2450 and CBX daughterboards. For interoperability tests I use mainly an Atheros (ath5k) WiFi card. The code can also be used for packet error rate simulations.
|
This an IEEE 802.11 a/g/p transceiver for GNU Radio v3.7. Over the air, I tested it with the Ettus USRP N210 with XCVR2450 and CBX daughterboards. For interoperability tests I use mainly an Atheros (ath5k) WiFi card. The code can also be used for packet error rate simulations.
|
||||||
|
|||||||
@@ -1,47 +1,52 @@
|
|||||||
Hi,
|
Hi!
|
||||||
|
|
||||||
|
This an IEEE 802.11 a/g/p transceiver for GNU Radio that is fitted for operation
|
||||||
|
with Ettus N210s and B210s. Interoperability was tested with many off-the-shelf
|
||||||
|
WiFi cards and IEEE 802.11p prototypes. The code can also be used in
|
||||||
|
simulations.
|
||||||
|
|
||||||
|
# Table of Contents
|
||||||
|
1. [Development](#development)
|
||||||
|
|
||||||
|
1. [Installation](#installation)
|
||||||
|
|
||||||
|
1. [Usage](#usage)
|
||||||
|
|
||||||
|
1. [Troubleshooting](#troubleshooting)
|
||||||
|
|
||||||
|
1. [Further information](#further-information)
|
||||||
|
|
||||||
|
# Development
|
||||||
|
|
||||||
|
Like GNU Radio, this module uses *maint* branches for development.
|
||||||
|
These branches are supposed to be used with the corresponding GNU Radio
|
||||||
|
branches. This means: the *maint-3.7* branch is compatible with GNU Radio 3.7,
|
||||||
|
*maint-3.8* is compatible with GNU Radio 3.8, etc.
|
||||||
|
|
||||||
this an IEEE 802.11 a/g/p transceiver for GNU Radio v3.7. Over the air, I tested it with the Ettus USRP N210 with XCVR2450 and CBX daughterboards. For interoperability tests I use mainly an Atheros (ath5k) WiFi card. The code can also be used for packet error rate simulations.
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
Please note that ```apt-get``` is the package manager of Debian/Ubuntu based systems, while ```port``` is one package manager for OSX. So use either (not both) according to your needs.
|
|
||||||
|
|
||||||
|
### GNU Radio
|
||||||
### log4cpp
|
|
||||||
|
|
||||||
I use the new [logging feature](http://gnuradio.org/doc/doxygen/page_logger.html) of GNU Radio which relies on log4cpp. This should be an optional dependency some day, but currently it is required. You can install it with
|
|
||||||
|
|
||||||
sudo apt-get install liblog4cpp5-dev
|
|
||||||
sudo port install log4cpp
|
|
||||||
|
|
||||||
|
|
||||||
### GNU Radio v3.7
|
|
||||||
|
|
||||||
You need at least version 3.7.3.
|
|
||||||
|
|
||||||
There are several ways to install GNU Radio. You can use
|
There are several ways to install GNU Radio. You can use
|
||||||
|
|
||||||
- [pybombs](http://gnuradio.org/redmine/projects/pybombs/wiki)
|
- [pybombs](http://gnuradio.org/redmine/projects/pybombs/wiki)
|
||||||
- [pre-combiled binaries](http://gnuradio.org/redmine/projects/gnuradio/wiki/BinaryPackages)
|
- [pre-compiled binaries](http://gnuradio.org/redmine/projects/gnuradio/wiki/BinaryPackages)
|
||||||
- [from source](http://gnuradio.org/redmine/projects/gnuradio/wiki/InstallingGRFromSource)
|
- [from source](http://gnuradio.org/redmine/projects/gnuradio/wiki/InstallingGRFromSource)
|
||||||
|
|
||||||
|
|
||||||
### IT++
|
|
||||||
|
|
||||||
I use the Viterbi decoder of IT++.
|
|
||||||
|
|
||||||
sudo apt-get install libitpp-dev
|
|
||||||
sudo port install itpp
|
|
||||||
|
|
||||||
|
|
||||||
### gr-foo
|
### gr-foo
|
||||||
|
|
||||||
I have some non project specific GNU Radio blocks in my gr-foo repo that are needed. For example the Wireshark connector. You can find these blocks at [https://github.com/bastibl/gr-foo](https://github.com/bastibl/gr-foo). They are installed with the typical command sequence:
|
I have some non project specific GNU Radio blocks in my gr-foo repo that are
|
||||||
|
needed. For example the Wireshark connector. You can find these blocks at
|
||||||
|
[https://github.com/bastibl/gr-foo](https://github.com/bastibl/gr-foo). They are
|
||||||
|
installed with the typical command sequence:
|
||||||
|
|
||||||
git clone https://github.com/bastibl/gr-foo.git
|
git clone https://github.com/bastibl/gr-foo
|
||||||
cd gr-foo
|
cd gr-foo
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
@@ -55,7 +60,7 @@ I have some non project specific GNU Radio blocks in my gr-foo repo that are nee
|
|||||||
|
|
||||||
To actually install the blocks do
|
To actually install the blocks do
|
||||||
|
|
||||||
git clone git://github.com/bastibl/gr-ieee802-11.git
|
git clone https://github.com/bastibl/gr-ieee802-11
|
||||||
cd gr-ieee802-11
|
cd gr-ieee802-11
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
@@ -65,48 +70,73 @@ To actually install the blocks do
|
|||||||
sudo ldconfig
|
sudo ldconfig
|
||||||
|
|
||||||
### Adjust Maximum Shared Memory
|
### Adjust Maximum Shared Memory
|
||||||
Since the transmitter is using the Tagged Stream blocks it has to store a complete frame in the buffer before processing it. The default maximum shared memory might not be enough on most Linux systems. It can be increased with
|
Since the transmitter is using the Tagged Stream blocks it has to store a
|
||||||
|
complete frame in the buffer before processing it. The default maximum shared
|
||||||
|
memory might not be enough on most Linux systems. It can be increased with
|
||||||
|
|
||||||
sudo sysctl -w kernel.shmmax=2147483648
|
sudo sysctl -w kernel.shmmax=2147483648
|
||||||
|
|
||||||
|
|
||||||
### OFDM PHY
|
### OFDM PHY
|
||||||
|
|
||||||
The physical layer is encapsulated in a hierarchical block to allow for a clearer transceiver structure in GNU Radio Companion. This hierarchical block is not included in the installation process. You have to open ```/examples/wifi_phy_hier.grc``` with GNU Radio Companion and build it. This will install the block in ```~/.grc_gnuradio/```.
|
The physical layer is encapsulated in a hierarchical block to allow for a
|
||||||
|
clearer transceiver structure in GNU Radio Companion. This hierarchical block is
|
||||||
|
not included in the installation process. You have to open
|
||||||
|
```/examples/wifi_phy_hier.grc``` with GNU Radio Companion and build it. This
|
||||||
|
will install the block in ```~/.grc_gnuradio/```.
|
||||||
|
|
||||||
|
|
||||||
### Check message port connections
|
### Check message port connections
|
||||||
|
|
||||||
Sometime the connections between the message ports (the gray ones in GNU Radio Companion) break. Therefore, please open the flow graphs and assert that everything is connected. It should be pretty obvious how the blocks are supposed to be wired. Actually this should not happen anymore, so if your ports are still unconnected please drop me a mail.
|
Sometime the connections between the message ports (the gray ones in GNU Radio
|
||||||
|
Companion) break. Therefore, please open the flow graphs and assert that
|
||||||
|
everything is connected. It should be pretty obvious how the blocks are supposed
|
||||||
|
to be wired. Actually this should not happen anymore, so if your ports are still
|
||||||
|
unconnected please drop me a mail.
|
||||||
|
|
||||||
|
|
||||||
### Python OpenGL
|
### Python OpenGL
|
||||||
|
|
||||||
If you want to run the receive demo (the one that plots the subcarrier constellations), please assert that you have python-opengl installed. The nongl version of the plot does not work for me.
|
If you want to run the receive demo (the one that plots the subcarrier
|
||||||
|
constellations), please assert that you have python-opengl installed. The nongl
|
||||||
|
version of the plot does not work for me.
|
||||||
|
|
||||||
|
|
||||||
### Run volk_profile
|
### Run volk_profile
|
||||||
|
|
||||||
volk_profile is part of GNU Radio. It benchmarks different SIMD implementations on your PC and creates a configuration file that stores the fastest version of every function. This can speed up the computation considerably and is required in order to deal with the high rate of incoming samples.
|
volk_profile is part of GNU Radio. It benchmarks different SIMD implementations
|
||||||
|
on your PC and creates a configuration file that stores the fastest version of
|
||||||
|
every function. This can speed up the computation considerably and is required
|
||||||
|
in order to deal with the high rate of incoming samples.
|
||||||
|
|
||||||
|
|
||||||
### Calibrate your daughterboard
|
### Calibrate your daughterboard
|
||||||
|
|
||||||
If you have a WBX, SBX, or CBX daughterboard you should calibrate it in order to minimize IQ imbalance and TX DC offsets. See the [application notes](http://files.ettus.com/uhd_docs/manual/html/calibration.html).
|
If you have a WBX, SBX, or CBX daughterboard you should calibrate it in order to
|
||||||
|
minimize IQ imbalance and TX DC offsets. See the [application
|
||||||
|
notes](http://files.ettus.com/manual/page_calibration.html).
|
||||||
|
|
||||||
|
|
||||||
|
# Checking your installation
|
||||||
|
|
||||||
# Checking you installation
|
As a first step I recommend to test the ```wifi_loopback.grc``` flow graph. This
|
||||||
|
flow graph does not need any hardware and allows you to ensure that the software
|
||||||
|
part is installed correctly. So open the flow graph and run it. If everything
|
||||||
|
works as intended you should see some decoded packets on the console.
|
||||||
|
|
||||||
As a first step I recommend to test the ```wifi_loopback.grc``` flow graph. This flow graph does not need any hardware and allows you to ensure that the software part is installed correctly. So open the flow graph and run it. If everything works as intended you should see some decoded 'Hello World' packets in the console.
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If GRC complains that it can't find some blocks (other than performance counters and hierarchical blocks) like
|
If GRC complains that it can't find some blocks (other than performance counters
|
||||||
|
and hierarchical blocks) like
|
||||||
|
|
||||||
>>> Error: Block key "ieee802_11_ofdm_mac" not found in Platform - grc(GNU Radio Companion)
|
>>> Error: Block key "ieee802_11_ofdm_mac" not found in Platform - grc(GNU Radio Companion)
|
||||||
>>> Error: Block key "foo_packet_pad" not found in Platform - grc(GNU Radio Companion)
|
>>> Error: Block key "foo_packet_pad" not found in Platform - grc(GNU Radio Companion)
|
||||||
|
|
||||||
Most likely you used a different ```CMAKE_INSTALL_PREFIX``` for the module than for GNU Radio. Therefore, the blocks of the module ended up in a different directory and GRC can't find them. You have to tell GRC where these blocks are by creating/adding to your ```~/.gnuradio/config.conf``` something like
|
Most likely you used a different ```CMAKE_INSTALL_PREFIX``` for the module than
|
||||||
|
for GNU Radio. Therefore, the blocks of the module ended up in a different
|
||||||
|
directory and GRC can't find them. You have to tell GRC where these blocks are
|
||||||
|
by creating/adding to your ```~/.gnuradio/config.conf``` something like
|
||||||
|
|
||||||
[grc]
|
[grc]
|
||||||
global_blocks_path = /opt/local/share/gnuradio/grc/blocks
|
global_blocks_path = /opt/local/share/gnuradio/grc/blocks
|
||||||
@@ -120,71 +150,69 @@ But with the directories that match your installation.
|
|||||||
|
|
||||||
## Simulation
|
## Simulation
|
||||||
|
|
||||||
The loopback flow graph should give you an idea of how simulations can be conducted. To ease use, most blocks have debugging and logging capabilities that can generate traces of the simulation. You can read about the logging feature and how to use it on the [GNU Radio Wiki](http://gnuradio.org/doc/doxygen/page_logger.html).
|
The loopback flow graph should give you an idea of how simulations can be
|
||||||
|
conducted. To ease use, most blocks have debugging and logging capabilities that
|
||||||
|
can generate traces of the simulation. You can read about the logging feature
|
||||||
|
and how to use it on the [GNU Radio
|
||||||
|
Wiki](https://wiki.gnuradio.org/index.php/Logging).
|
||||||
|
|
||||||
|
|
||||||
## Unidirectional communication
|
## Unidirectional communication
|
||||||
|
|
||||||
As first over the air test I recommend to try ```wifi_rx.grc``` and ```wifi_tx.grc```. Just open the flow graphs in GNU Radio companion and execute them. If it does not work out of the box, try to play around with the gain. If everything works as intended you should see similar output as in the ```wifi_loopback.grc``` example.
|
As first over the air test I recommend to try ```wifi_rx.grc``` and
|
||||||
|
```wifi_tx.grc```. Just open the flow graphs in GNU Radio companion and execute
|
||||||
|
them. If it does not work out of the box, try to play around with the gain. If
|
||||||
## RX frames from a WiFi card
|
everything works as intended you should see similar output as in the
|
||||||
|
```wifi_loopback.grc``` example.
|
||||||
TBD
|
|
||||||
|
|
||||||
|
|
||||||
## TX frames to a WiFi card
|
|
||||||
|
|
||||||
TBD
|
|
||||||
|
|
||||||
|
|
||||||
## Transceiver (SDR <-> SDR)
|
|
||||||
|
|
||||||
TBD
|
|
||||||
|
|
||||||
|
|
||||||
## Ad Hoc Network with WiFi card
|
## Ad Hoc Network with WiFi card
|
||||||
|
|
||||||
- The transceiver is currently connected to a TAP device, i.e. is a virtual Ethernet interface. Therefore, we have no WiFi signaling like association requests and hence, the transceiver can not "join" an ad hoc network. You have to make some small changes to the kernel in order to convince you WiFi card to send to this hosts nevertheless.
|
- The transceiver is currently connected to a TAP device, i.e. is a virtual
|
||||||
- The transceiver can not respond to ACKs in time. This is kind of an architectural limitation of USRP + GNU Radio since Ethernet and computations on a normal CPU introduce some latency. You can set the number of ACK retries to zero and handle retransmits on higher layers (-> TCP).
|
Ethernet interface. Therefore, we have no WiFi signaling like association
|
||||||
- RTS/CTS is not working for the same reason. You can however just disable this mechanism.
|
requests and hence, the transceiver can not "join" an ad hoc network. You have
|
||||||
- Currently, there is no CSMA/CA mechanism, but this can be implemented on the FPGA.
|
to make some small changes to the kernel in order to convince you WiFi card to
|
||||||
|
send to this hosts nevertheless.
|
||||||
|
- The transceiver can not respond to ACKs in time. This is kind of an
|
||||||
|
architectural limitation of USRP + GNU Radio since Ethernet and computations
|
||||||
|
on a normal CPU introduce some latency. You can set the number of ACK retries
|
||||||
|
to zero and handle retransmits on higher layers (-> TCP).
|
||||||
|
- RTS/CTS is not working for the same reason. You can however just disable this
|
||||||
|
mechanism.
|
||||||
|
- Currently, there is no CSMA/CA mechanism, but this can be implemented on the
|
||||||
|
FPGA.
|
||||||
|
|
||||||
|
|
||||||
# Troubleshooting
|
# Troubleshooting
|
||||||
|
|
||||||
|
- Please check compile and installation logs. They might contain interesting
|
||||||
|
information.
|
||||||
- Did you calibrate your daughterboard?
|
- Did you calibrate your daughterboard?
|
||||||
- Did you run volk_profile?
|
- Did you run volk_profile?
|
||||||
- Did you try different gain settings?
|
- Did you try different gain settings?
|
||||||
- Did you close the case of the devices?
|
- Did you close the case of the devices?
|
||||||
- Did you try real-time priority?
|
- Did you try real-time priority?
|
||||||
- Did you compile GNU Radio and gr-ieee802-11 in release mode?
|
- Did you compile GNU Radio and gr-ieee802-11 in release mode?
|
||||||
- If you see warnings that ```blocks_ctrlport_monitor_performance``` is missing that means that you installed GNU Radio without control port or performance counters. These blocks allow you to monitor the performance of the transceiver while it is running, but are not required. You can just delete them from the flow graph.
|
- If you see warnings that ```blocks_ctrlport_monitor_performance``` is missing
|
||||||
|
that means that you installed GNU Radio without control port or performance
|
||||||
|
counters. These blocks allow you to monitor the performance of the transceiver
|
||||||
|
while it is running, but are not required. You can just delete them from the
|
||||||
|
flow graph.
|
||||||
- The message
|
- The message
|
||||||
|
|
||||||
You must now use ifconfig to set its IP address. E.g.,
|
You must now use ifconfig to set its IP address. E.g.,
|
||||||
$ sudo ifconfig tap0 192.168.200.1
|
$ sudo ifconfig tap0 192.168.200.1
|
||||||
|
|
||||||
is normal and is output by the TUN/Tap Block during startup. The configuration of the TUN/TAP interface is handled by the scripts in the ```apps``` folder.
|
is normal and is output by the TUN/Tap Block during startup. The configuration
|
||||||
- Did you try to tune the RF frequency out of the band of interest (i.e. used the LO offset menu of the flow graphs)?
|
of the TUN/TAP interface is handled by the scripts in the ```apps``` folder.
|
||||||
- If 'D's appear, it might be related to your Ethernet card. Assert that you made the sysconf changes recommended by Ettus. Did you try to connect you PC directly to the USRP without a switch in between?
|
- Did you try to tune the RF frequency out of the band of interest (i.e. used
|
||||||
|
the LO offset menu of the flow graphs)?
|
||||||
|
- If 'D's appear, it might be related to your Ethernet card. Assert that you
|
||||||
# Asking for help
|
made the sysconf changes recommended by Ettus. Did you try to connect you PC
|
||||||
|
directly to the USRP without a switch in between?
|
||||||
In order to help you it is crucial that you provide enough information about what is going wrong and what you are actually trying to do. So if you write me please include at least the following
|
|
||||||
|
|
||||||
- OS (Ubuntu, OSX...)
|
|
||||||
- hardware (SDR and daughterboard)
|
|
||||||
- GNU Radio version
|
|
||||||
- What are you trying to do
|
|
||||||
- What is you setup, i.e. are you transmitting between SDRs or with WiFi cards.
|
|
||||||
- Bandwidth and frequency
|
|
||||||
- What did you already do to debug?
|
|
||||||
- Where exactly does it break, i.e. is frame detection working? Is the signal field decoded correctly?).
|
|
||||||
|
|
||||||
|
|
||||||
# Further information
|
# Further information
|
||||||
|
|
||||||
For further information please checkout our project page
|
For further information please checkout our project page
|
||||||
[http://www.ccs-labs.org/projects/wime/](http://www.ccs-labs.org/projects/wime/)
|
[https://www.wime-project.net](https://www.wime-project.net)
|
||||||
|
|||||||
+3
-1
@@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
FILE="/tmp/ofdm.pcap"
|
### Enable Wireshark Connector in wifi_rx flow graph
|
||||||
|
|
||||||
|
FILE="/tmp/wifi.pcap"
|
||||||
FLOWGRAPH="wifi_rx.py"
|
FLOWGRAPH="wifi_rx.py"
|
||||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
# the new option.
|
# the new option.
|
||||||
# E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
|
# E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
|
||||||
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
|
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
|
||||||
# be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
|
# be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefore.
|
||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
# Copyright 2010 Alexander Neundorf <neundorf@kde.org>
|
# Copyright 2010 Alexander Neundorf <neundorf@kde.org>
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
# http://www.cmake.org/pipermail/cmake/2006-October/011446.html
|
|
||||||
# Modified to use pkg config and use standard var names
|
|
||||||
|
|
||||||
#
|
|
||||||
# Find the CppUnit includes and library
|
|
||||||
#
|
|
||||||
# This module defines
|
|
||||||
# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
|
|
||||||
# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
|
|
||||||
# CPPUNIT_FOUND, If false, do not try to use CppUnit.
|
|
||||||
|
|
||||||
INCLUDE(FindPkgConfig)
|
|
||||||
PKG_CHECK_MODULES(PC_CPPUNIT "cppunit")
|
|
||||||
|
|
||||||
FIND_PATH(CPPUNIT_INCLUDE_DIRS
|
|
||||||
NAMES cppunit/TestCase.h
|
|
||||||
HINTS ${PC_CPPUNIT_INCLUDE_DIR}
|
|
||||||
PATHS
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(CPPUNIT_LIBRARIES
|
|
||||||
NAMES cppunit
|
|
||||||
HINTS ${PC_CPPUNIT_LIBDIR}
|
|
||||||
PATHS
|
|
||||||
${CPPUNIT_INCLUDE_DIRS}/../lib
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
LIST(APPEND CPPUNIT_LIBRARIES ${CMAKE_DL_LIBS})
|
|
||||||
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPPUNIT DEFAULT_MSG CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
|
|
||||||
MARK_AS_ADVANCED(CPPUNIT_LIBRARIES CPPUNIT_INCLUDE_DIRS)
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# - Find ITPP
|
|
||||||
# Find the native ITPP includes and library
|
|
||||||
# This module defines
|
|
||||||
# ITPP_INCLUDE_DIR, where to find itpp/itbase.h, etc.
|
|
||||||
# ITPP_LIBRARIES, the libraries needed to use ITPP.
|
|
||||||
# ITPP_FOUND, If false, do not try to use ITPP.
|
|
||||||
# also defined, but not for general use are
|
|
||||||
# ITPP_LIBRARY, where to find the ITPP library.
|
|
||||||
|
|
||||||
include(FindPkgConfig)
|
|
||||||
pkg_check_modules(PC_ITPP itpp)
|
|
||||||
|
|
||||||
find_path(ITPP_INCLUDE_DIR
|
|
||||||
NAMES itpp/itbase.h
|
|
||||||
HINTS ${PC_ITPP_INCLUDEDIR}/include
|
|
||||||
${ITPP_DIR}/include
|
|
||||||
/usr/pkgs64/include
|
|
||||||
/usr/include
|
|
||||||
/usr/local/include
|
|
||||||
)
|
|
||||||
find_library(ITPP_LIBRARY_NORMAL
|
|
||||||
NAMES itpp
|
|
||||||
HINTS ${PC_ITPP_LIBDIR}
|
|
||||||
PATHS ${ITPP_DIR}/libs
|
|
||||||
"${ITPP_DIR}\\win32\\lib"
|
|
||||||
/usr/pkgs64/lib
|
|
||||||
/usr/lib64
|
|
||||||
/usr/lib
|
|
||||||
/usr/local/lib
|
|
||||||
)
|
|
||||||
find_library(ITPP_LIBRARY_DEBUG
|
|
||||||
NAMES itpp_debug
|
|
||||||
HINTS ${PC_ITPP_LIBDIR}
|
|
||||||
PATHS ${ITPP_DIR}/libs
|
|
||||||
"${ITPP_DIR}\\win32\\lib"
|
|
||||||
/usr/pkgs64/lib
|
|
||||||
/usr/lib64
|
|
||||||
/usr/lib
|
|
||||||
/usr/local/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
if (ITPP_LIBRARY_NORMAL OR ITPP_LIBRARY_DEBUG)
|
|
||||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ITPP_LIBRARY_DEBUG)
|
|
||||||
SET (ITPP_LIBRARY ${ITPP_LIBRARY_DEBUG})
|
|
||||||
else (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ITPP_LIBRARY_DEBUG)
|
|
||||||
SET (ITPP_LIBRARY ${ITPP_LIBRARY_NORMAL})
|
|
||||||
endif (CMAKE_BUILD_TYPE STREQUAL "Debug" AND ITPP_LIBRARY_DEBUG)
|
|
||||||
endif (ITPP_LIBRARY_NORMAL OR ITPP_LIBRARY_DEBUG)
|
|
||||||
|
|
||||||
if (ITPP_LIBRARY AND ITPP_INCLUDE_DIR)
|
|
||||||
SET(ITPP_LIBRARIES ${ITPP_LIBRARY})
|
|
||||||
SET(ITPP_FOUND "YES")
|
|
||||||
else (ITPP_LIBRARY AND ITPP_INCLUDE_DIR)
|
|
||||||
SET(ITPP_FOUND "NO")
|
|
||||||
endif (ITPP_LIBRARY AND ITPP_INCLUDE_DIR)
|
|
||||||
|
|
||||||
if (ITPP_FOUND)
|
|
||||||
if (NOT ITPP_FIND_QUIETLY)
|
|
||||||
MESSAGE(STATUS "Found ITPP: ${ITPP_LIBRARIES}")
|
|
||||||
endif (NOT ITPP_FIND_QUIETLY)
|
|
||||||
else (ITPP_FOUND)
|
|
||||||
if (ITPP_FIND_REQUIRED)
|
|
||||||
MESSAGE(FATAL_ERROR "Could not find ITPP library")
|
|
||||||
endif (ITPP_FIND_REQUIRED)
|
|
||||||
endif (ITPP_FOUND)
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
ITPP_LIBRARY
|
|
||||||
ITPP_INCLUDE_DIR
|
|
||||||
)
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# - Find Log4cpp
|
|
||||||
# Find the native LOG4CPP includes and library
|
|
||||||
#
|
|
||||||
# LOG4CPP_INCLUDE_DIR - where to find LOG4CPP.h, etc.
|
|
||||||
# LOG4CPP_LIBRARIES - List of libraries when using LOG4CPP.
|
|
||||||
# LOG4CPP_FOUND - True if LOG4CPP found.
|
|
||||||
|
|
||||||
|
|
||||||
if (LOG4CPP_INCLUDE_DIR)
|
|
||||||
# Already in cache, be silent
|
|
||||||
set(LOG4CPP_FIND_QUIETLY TRUE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
find_path(LOG4CPP_INCLUDE_DIR log4cpp/Category.hh
|
|
||||||
/opt/local/include
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include
|
|
||||||
)
|
|
||||||
|
|
||||||
set(LOG4CPP_NAMES log4cpp)
|
|
||||||
find_library(LOG4CPP_LIBRARY
|
|
||||||
NAMES ${LOG4CPP_NAMES}
|
|
||||||
PATHS /usr/lib /usr/local/lib /opt/local/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (LOG4CPP_INCLUDE_DIR AND LOG4CPP_LIBRARY)
|
|
||||||
set(LOG4CPP_FOUND TRUE)
|
|
||||||
set(LOG4CPP_LIBRARIES ${LOG4CPP_LIBRARY} CACHE INTERNAL "" FORCE)
|
|
||||||
set(LOG4CPP_INCLUDE_DIRS ${LOG4CPP_INCLUDE_DIR} CACHE INTERNAL "" FORCE)
|
|
||||||
else ()
|
|
||||||
set(LOG4CPP_FOUND FALSE CACHE INTERNAL "" FORCE)
|
|
||||||
set(LOG4CPP_LIBRARY "" CACHE INTERNAL "" FORCE)
|
|
||||||
set(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
|
|
||||||
set(LOG4CPP_INCLUDE_DIR "" CACHE INTERNAL "" FORCE)
|
|
||||||
set(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (LOG4CPP_FOUND)
|
|
||||||
if (NOT LOG4CPP_FIND_QUIETLY)
|
|
||||||
message(STATUS "Found LOG4CPP: ${LOG4CPP_LIBRARIES}")
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
if (LOG4CPP_FIND_REQUIRED)
|
|
||||||
message(STATUS "Looked for LOG4CPP libraries named ${LOG4CPPS_NAMES}.")
|
|
||||||
message(FATAL_ERROR "Could NOT find LOG4CPP library")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
LOG4CPP_LIBRARIES
|
|
||||||
LOG4CPP_INCLUDE_DIRS
|
|
||||||
)
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
# Copyright 2010-2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_COMPONENT_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_COMPONENT_CMAKE TRUE)
|
|
||||||
|
|
||||||
set(_gr_enabled_components "" CACHE INTERNAL "" FORCE)
|
|
||||||
set(_gr_disabled_components "" CACHE INTERNAL "" FORCE)
|
|
||||||
|
|
||||||
if(NOT DEFINED ENABLE_DEFAULT)
|
|
||||||
set(ENABLE_DEFAULT ON)
|
|
||||||
message(STATUS "")
|
|
||||||
message(STATUS "The build system will automatically enable all components.")
|
|
||||||
message(STATUS "Use -DENABLE_DEFAULT=OFF to disable components by default.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Register a component into the system
|
|
||||||
# - name: canonical component name
|
|
||||||
# - var: variable for enabled status
|
|
||||||
# - argn: list of dependencies
|
|
||||||
########################################################################
|
|
||||||
function(GR_REGISTER_COMPONENT name var)
|
|
||||||
include(CMakeDependentOption)
|
|
||||||
message(STATUS "")
|
|
||||||
message(STATUS "Configuring ${name} support...")
|
|
||||||
foreach(dep ${ARGN})
|
|
||||||
message(STATUS " Dependency ${dep} = ${${dep}}")
|
|
||||||
endforeach(dep)
|
|
||||||
|
|
||||||
#if the user set the var to force on, we note this
|
|
||||||
if("${${var}}" STREQUAL "ON")
|
|
||||||
set(var_force TRUE)
|
|
||||||
else()
|
|
||||||
set(var_force FALSE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#rewrite the dependency list so that deps that are also components use the cached version
|
|
||||||
unset(comp_deps)
|
|
||||||
foreach(dep ${ARGN})
|
|
||||||
list(FIND _gr_enabled_components ${dep} dep_enb_index)
|
|
||||||
list(FIND _gr_disabled_components ${dep} dep_dis_index)
|
|
||||||
if (${dep_enb_index} EQUAL -1 AND ${dep_dis_index} EQUAL -1)
|
|
||||||
list(APPEND comp_deps ${dep})
|
|
||||||
else()
|
|
||||||
list(APPEND comp_deps ${dep}_cached) #is a component, use cached version
|
|
||||||
endif()
|
|
||||||
endforeach(dep)
|
|
||||||
|
|
||||||
#setup the dependent option for this component
|
|
||||||
CMAKE_DEPENDENT_OPTION(${var} "enable ${name} support" ${ENABLE_DEFAULT} "${comp_deps}" OFF)
|
|
||||||
set(${var} "${${var}}" PARENT_SCOPE)
|
|
||||||
set(${var}_cached "${${var}}" CACHE INTERNAL "" FORCE)
|
|
||||||
|
|
||||||
#force was specified, but the dependencies were not met
|
|
||||||
if(NOT ${var} AND var_force)
|
|
||||||
message(FATAL_ERROR "user force-enabled ${name} but configuration checked failed")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#append the component into one of the lists
|
|
||||||
if(${var})
|
|
||||||
message(STATUS " Enabling ${name} support.")
|
|
||||||
list(APPEND _gr_enabled_components ${name})
|
|
||||||
else(${var})
|
|
||||||
message(STATUS " Disabling ${name} support.")
|
|
||||||
list(APPEND _gr_disabled_components ${name})
|
|
||||||
endif(${var})
|
|
||||||
message(STATUS " Override with -D${var}=ON/OFF")
|
|
||||||
|
|
||||||
#make components lists into global variables
|
|
||||||
set(_gr_enabled_components ${_gr_enabled_components} CACHE INTERNAL "" FORCE)
|
|
||||||
set(_gr_disabled_components ${_gr_disabled_components} CACHE INTERNAL "" FORCE)
|
|
||||||
endfunction(GR_REGISTER_COMPONENT)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Print the registered component summary
|
|
||||||
########################################################################
|
|
||||||
function(GR_PRINT_COMPONENT_SUMMARY)
|
|
||||||
message(STATUS "")
|
|
||||||
message(STATUS "######################################################")
|
|
||||||
message(STATUS "# gr-fosphor enabled components ")
|
|
||||||
message(STATUS "######################################################")
|
|
||||||
foreach(comp ${_gr_enabled_components})
|
|
||||||
message(STATUS " * ${comp}")
|
|
||||||
endforeach(comp)
|
|
||||||
|
|
||||||
message(STATUS "")
|
|
||||||
message(STATUS "######################################################")
|
|
||||||
message(STATUS "# gr-fosphor disabled components ")
|
|
||||||
message(STATUS "######################################################")
|
|
||||||
foreach(comp ${_gr_disabled_components})
|
|
||||||
message(STATUS " * ${comp}")
|
|
||||||
endforeach(comp)
|
|
||||||
|
|
||||||
message(STATUS "")
|
|
||||||
endfunction(GR_PRINT_COMPONENT_SUMMARY)
|
|
||||||
@@ -1,519 +0,0 @@
|
|||||||
# Copyright 2010-2011,2014 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_MISC_UTILS_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Set global variable macro.
|
|
||||||
# Used for subdirectories to export settings.
|
|
||||||
# Example: include and library paths.
|
|
||||||
########################################################################
|
|
||||||
function(GR_SET_GLOBAL var)
|
|
||||||
set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
|
|
||||||
endfunction(GR_SET_GLOBAL)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Set the pre-processor definition if the condition is true.
|
|
||||||
# - def the pre-processor definition to set and condition name
|
|
||||||
########################################################################
|
|
||||||
function(GR_ADD_COND_DEF def)
|
|
||||||
if(${def})
|
|
||||||
add_definitions(-D${def})
|
|
||||||
endif(${def})
|
|
||||||
endfunction(GR_ADD_COND_DEF)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Check for a header and conditionally set a compile define.
|
|
||||||
# - hdr the relative path to the header file
|
|
||||||
# - def the pre-processor definition to set
|
|
||||||
########################################################################
|
|
||||||
function(GR_CHECK_HDR_N_DEF hdr def)
|
|
||||||
include(CheckIncludeFileCXX)
|
|
||||||
CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
|
|
||||||
GR_ADD_COND_DEF(${def})
|
|
||||||
endfunction(GR_CHECK_HDR_N_DEF)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Include subdirectory macro.
|
|
||||||
# Sets the CMake directory variables,
|
|
||||||
# includes the subdirectory CMakeLists.txt,
|
|
||||||
# resets the CMake directory variables.
|
|
||||||
#
|
|
||||||
# This macro includes subdirectories rather than adding them
|
|
||||||
# so that the subdirectory can affect variables in the level above.
|
|
||||||
# This provides a work-around for the lack of convenience libraries.
|
|
||||||
# This way a subdirectory can append to the list of library sources.
|
|
||||||
########################################################################
|
|
||||||
macro(GR_INCLUDE_SUBDIRECTORY subdir)
|
|
||||||
#insert the current directories on the front of the list
|
|
||||||
list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
|
|
||||||
#set the current directories to the names of the subdirs
|
|
||||||
set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
|
|
||||||
set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
|
|
||||||
|
|
||||||
#include the subdirectory CMakeLists to run it
|
|
||||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
|
|
||||||
|
|
||||||
#reset the value of the current directories
|
|
||||||
list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
|
|
||||||
list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
|
|
||||||
|
|
||||||
#pop the subdir names of the front of the list
|
|
||||||
list(REMOVE_AT _cmake_source_dirs 0)
|
|
||||||
list(REMOVE_AT _cmake_binary_dirs 0)
|
|
||||||
endmacro(GR_INCLUDE_SUBDIRECTORY)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Check if a compiler flag works and conditionally set a compile define.
|
|
||||||
# - flag the compiler flag to check for
|
|
||||||
# - have the variable to set with result
|
|
||||||
########################################################################
|
|
||||||
macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
CHECK_CXX_COMPILER_FLAG(${flag} ${have})
|
|
||||||
if(${have})
|
|
||||||
add_definitions(${flag})
|
|
||||||
endif(${have})
|
|
||||||
endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Generates the .la libtool file
|
|
||||||
# This appears to generate libtool files that cannot be used by auto*.
|
|
||||||
# Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
|
|
||||||
# Notice: there is not COMPONENT option, these will not get distributed.
|
|
||||||
########################################################################
|
|
||||||
function(GR_LIBTOOL)
|
|
||||||
if(NOT DEFINED GENERATE_LIBTOOL)
|
|
||||||
set(GENERATE_LIBTOOL OFF) #disabled by default
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(GENERATE_LIBTOOL)
|
|
||||||
include(CMakeParseArgumentsCopy)
|
|
||||||
CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
|
|
||||||
|
|
||||||
find_program(LIBTOOL libtool)
|
|
||||||
if(LIBTOOL)
|
|
||||||
include(CMakeMacroLibtoolFile)
|
|
||||||
CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
|
|
||||||
endif(LIBTOOL)
|
|
||||||
endif(GENERATE_LIBTOOL)
|
|
||||||
|
|
||||||
endfunction(GR_LIBTOOL)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Do standard things to the library target
|
|
||||||
# - set target properties
|
|
||||||
# - make install rules
|
|
||||||
# Also handle gnuradio custom naming conventions w/ extras mode.
|
|
||||||
########################################################################
|
|
||||||
function(GR_LIBRARY_FOO target)
|
|
||||||
#parse the arguments for component names
|
|
||||||
include(CMakeParseArgumentsCopy)
|
|
||||||
CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
|
|
||||||
|
|
||||||
#set additional target properties
|
|
||||||
set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
|
|
||||||
|
|
||||||
#install the generated files like so...
|
|
||||||
install(TARGETS ${target}
|
|
||||||
LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
|
|
||||||
ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file
|
|
||||||
RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
|
|
||||||
)
|
|
||||||
|
|
||||||
#extras mode enabled automatically on linux
|
|
||||||
if(NOT DEFINED LIBRARY_EXTRAS)
|
|
||||||
set(LIBRARY_EXTRAS ${LINUX})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#special extras mode to enable alternative naming conventions
|
|
||||||
if(LIBRARY_EXTRAS)
|
|
||||||
|
|
||||||
#create .la file before changing props
|
|
||||||
GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
|
|
||||||
|
|
||||||
#give the library a special name with ultra-zero soversion
|
|
||||||
set_target_properties(${target} PROPERTIES OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
|
|
||||||
set(target_name lib${target}-${LIBVER}.so.0.0.0)
|
|
||||||
|
|
||||||
#custom command to generate symlinks
|
|
||||||
add_custom_command(
|
|
||||||
TARGET ${target}
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
|
|
||||||
)
|
|
||||||
|
|
||||||
#and install the extra symlinks
|
|
||||||
install(
|
|
||||||
FILES
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
|
|
||||||
DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
|
|
||||||
)
|
|
||||||
|
|
||||||
endif(LIBRARY_EXTRAS)
|
|
||||||
endfunction(GR_LIBRARY_FOO)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Create a dummy custom command that depends on other targets.
|
|
||||||
# Usage:
|
|
||||||
# GR_GEN_TARGET_DEPS(unique_name target_deps <target1> <target2> ...)
|
|
||||||
# ADD_CUSTOM_COMMAND(<the usual args> ${target_deps})
|
|
||||||
#
|
|
||||||
# Custom command cant depend on targets, but can depend on executables,
|
|
||||||
# and executables can depend on targets. So this is the process:
|
|
||||||
########################################################################
|
|
||||||
function(GR_GEN_TARGET_DEPS name var)
|
|
||||||
file(
|
|
||||||
WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
|
|
||||||
"int main(void){return 0;}\n"
|
|
||||||
)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
|
|
||||||
)
|
|
||||||
add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
|
|
||||||
if(ARGN)
|
|
||||||
add_dependencies(${name} ${ARGN})
|
|
||||||
endif(ARGN)
|
|
||||||
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
|
||||||
set(${var} "DEPENDS;${name}" PARENT_SCOPE) #cant call command when cross
|
|
||||||
else()
|
|
||||||
set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
endfunction(GR_GEN_TARGET_DEPS)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Control use of gr_logger
|
|
||||||
# Usage:
|
|
||||||
# GR_LOGGING()
|
|
||||||
#
|
|
||||||
# Will set ENABLE_GR_LOG to 1 by default.
|
|
||||||
# Can manually set with -DENABLE_GR_LOG=0|1
|
|
||||||
########################################################################
|
|
||||||
function(GR_LOGGING)
|
|
||||||
find_package(Log4cpp)
|
|
||||||
|
|
||||||
OPTION(ENABLE_GR_LOG "Use gr_logger" ON)
|
|
||||||
if(ENABLE_GR_LOG)
|
|
||||||
# If gr_logger is enabled, make it usable
|
|
||||||
add_definitions( -DENABLE_GR_LOG )
|
|
||||||
|
|
||||||
# also test LOG4CPP; if we have it, use this version of the logger
|
|
||||||
# otherwise, default to the stdout/stderr model.
|
|
||||||
if(LOG4CPP_FOUND)
|
|
||||||
SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE)
|
|
||||||
add_definitions( -DHAVE_LOG4CPP )
|
|
||||||
else(not LOG4CPP_FOUND)
|
|
||||||
SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
|
|
||||||
endif(LOG4CPP_FOUND)
|
|
||||||
|
|
||||||
SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE)
|
|
||||||
|
|
||||||
else(ENABLE_GR_LOG)
|
|
||||||
SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE)
|
|
||||||
SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE)
|
|
||||||
endif(ENABLE_GR_LOG)
|
|
||||||
|
|
||||||
message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.")
|
|
||||||
message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.")
|
|
||||||
message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.")
|
|
||||||
|
|
||||||
endfunction(GR_LOGGING)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Run GRCC to compile .grc files into .py files.
|
|
||||||
#
|
|
||||||
# Usage: GRCC(filename, directory)
|
|
||||||
# - filenames: List of file name of .grc file
|
|
||||||
# - directory: directory of built .py file - usually in
|
|
||||||
# ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
# - Sets PYFILES: output converted GRC file names to Python files.
|
|
||||||
########################################################################
|
|
||||||
function(GRCC)
|
|
||||||
# Extract directory from list of args, remove it for the list of filenames.
|
|
||||||
list(GET ARGV -1 directory)
|
|
||||||
list(REMOVE_AT ARGV -1)
|
|
||||||
set(filenames ${ARGV})
|
|
||||||
file(MAKE_DIRECTORY ${directory})
|
|
||||||
|
|
||||||
SET(GRCC_COMMAND ${CMAKE_SOURCE_DIR}/gr-utils/python/grcc)
|
|
||||||
|
|
||||||
# GRCC uses some stuff in grc and gnuradio-runtime, so we force
|
|
||||||
# the known paths here
|
|
||||||
list(APPEND PYTHONPATHS
|
|
||||||
${CMAKE_SOURCE_DIR}
|
|
||||||
${CMAKE_SOURCE_DIR}/gnuradio-runtime/python
|
|
||||||
${CMAKE_SOURCE_DIR}/gnuradio-runtime/lib/swig
|
|
||||||
${CMAKE_BINARY_DIR}/gnuradio-runtime/lib/swig
|
|
||||||
)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
#SWIG generates the python library files into a subdirectory.
|
|
||||||
#Therefore, we must append this subdirectory into PYTHONPATH.
|
|
||||||
#Only do this for the python directories matching the following:
|
|
||||||
foreach(pydir ${PYTHONPATHS})
|
|
||||||
get_filename_component(name ${pydir} NAME)
|
|
||||||
if(name MATCHES "^(swig|lib|src)$")
|
|
||||||
list(APPEND PYTHONPATHS ${pydir}/${CMAKE_BUILD_TYPE})
|
|
||||||
endif()
|
|
||||||
endforeach(pydir)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
file(TO_NATIVE_PATH "${PYTHONPATHS}" pypath)
|
|
||||||
|
|
||||||
if(UNIX)
|
|
||||||
list(APPEND pypath "$PYTHONPATH")
|
|
||||||
string(REPLACE ";" ":" pypath "${pypath}")
|
|
||||||
set(ENV{PYTHONPATH} ${pypath})
|
|
||||||
endif(UNIX)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
list(APPEND pypath "%PYTHONPATH%")
|
|
||||||
string(REPLACE ";" "\\;" pypath "${pypath}")
|
|
||||||
#list(APPEND environs "PYTHONPATH=${pypath}")
|
|
||||||
set(ENV{PYTHONPATH} ${pypath})
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
foreach(f ${filenames})
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GRCC_COMMAND} -d ${directory} ${f}
|
|
||||||
)
|
|
||||||
string(REPLACE ".grc" ".py" pyfile "${f}")
|
|
||||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" pyfile "${pyfile}")
|
|
||||||
list(APPEND pyfiles ${pyfile})
|
|
||||||
endforeach(f)
|
|
||||||
|
|
||||||
set(PYFILES ${pyfiles} PARENT_SCOPE)
|
|
||||||
endfunction(GRCC)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Check if HAVE_PTHREAD_SETSCHEDPARAM and HAVE_SCHED_SETSCHEDULER
|
|
||||||
# should be defined
|
|
||||||
########################################################################
|
|
||||||
macro(GR_CHECK_LINUX_SCHED_AVAIL)
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES -lpthread)
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
|
||||||
#include <pthread.h>
|
|
||||||
int main(){
|
|
||||||
pthread_t pthread;
|
|
||||||
pthread_setschedparam(pthread, 0, 0);
|
|
||||||
return 0;
|
|
||||||
} " HAVE_PTHREAD_SETSCHEDPARAM
|
|
||||||
)
|
|
||||||
GR_ADD_COND_DEF(HAVE_PTHREAD_SETSCHEDPARAM)
|
|
||||||
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
|
||||||
#include <sched.h>
|
|
||||||
int main(){
|
|
||||||
pid_t pid;
|
|
||||||
sched_setscheduler(pid, 0, 0);
|
|
||||||
return 0;
|
|
||||||
} " HAVE_SCHED_SETSCHEDULER
|
|
||||||
)
|
|
||||||
GR_ADD_COND_DEF(HAVE_SCHED_SETSCHEDULER)
|
|
||||||
endmacro(GR_CHECK_LINUX_SCHED_AVAIL)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Macros to generate source and header files from template
|
|
||||||
########################################################################
|
|
||||||
macro(GR_EXPAND_X_H component root)
|
|
||||||
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
"#!${PYTHON_EXECUTABLE}
|
|
||||||
|
|
||||||
import sys, os, re
|
|
||||||
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_dict2(name, sig, '${component}')
|
|
||||||
build_utils.expand_template(d, inp)
|
|
||||||
")
|
|
||||||
|
|
||||||
#make a list of all the generated headers
|
|
||||||
unset(expanded_files_h)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
unset(name)
|
|
||||||
|
|
||||||
#create a command to generate the headers
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated headers
|
|
||||||
list(APPEND generated_includes ${expanded_files_h})
|
|
||||||
|
|
||||||
endmacro(GR_EXPAND_X_H)
|
|
||||||
|
|
||||||
macro(GR_EXPAND_X_CC_H component root)
|
|
||||||
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
"#!${PYTHON_EXECUTABLE}
|
|
||||||
|
|
||||||
import sys, os, re
|
|
||||||
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_impl_dict2(name, sig, '${component}')
|
|
||||||
build_utils.expand_template(d, inp)
|
|
||||||
")
|
|
||||||
|
|
||||||
#make a list of all the generated files
|
|
||||||
unset(expanded_files_cc)
|
|
||||||
unset(expanded_files_h)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_cc ${CMAKE_CURRENT_BINARY_DIR}/${name}.cc)
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
unset(name)
|
|
||||||
|
|
||||||
#create a command to generate the source files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_cc}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.cc.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}.cc.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#create a command to generate the header files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#make source files depends on headers to force generation
|
|
||||||
set_source_files_properties(${expanded_files_cc}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated files
|
|
||||||
list(APPEND generated_sources ${expanded_files_cc})
|
|
||||||
list(APPEND generated_headers ${expanded_files_h})
|
|
||||||
|
|
||||||
endmacro(GR_EXPAND_X_CC_H)
|
|
||||||
|
|
||||||
macro(GR_EXPAND_X_CC_H_IMPL component root)
|
|
||||||
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
"#!${PYTHON_EXECUTABLE}
|
|
||||||
|
|
||||||
import sys, os, re
|
|
||||||
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_dict(name, sig, '${component}')
|
|
||||||
build_utils.expand_template(d, inp, '_impl')
|
|
||||||
")
|
|
||||||
|
|
||||||
#make a list of all the generated files
|
|
||||||
unset(expanded_files_cc_impl)
|
|
||||||
unset(expanded_files_h_impl)
|
|
||||||
unset(expanded_files_h)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
|
|
||||||
list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/gnuradio/${component}/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
unset(name)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.cc files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_cc_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.cc.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.h files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.cc source files depend on _impl.h to force generation
|
|
||||||
set_source_files_properties(${expanded_files_cc_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.h source files depend on headers to force generation
|
|
||||||
set_source_files_properties(${expanded_files_h_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated files
|
|
||||||
list(APPEND generated_sources ${expanded_files_cc_impl})
|
|
||||||
list(APPEND generated_headers ${expanded_files_h_impl})
|
|
||||||
|
|
||||||
endmacro(GR_EXPAND_X_CC_H_IMPL)
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# Copyright 2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup additional defines for OS types
|
|
||||||
########################################################################
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
set(LINUX TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LINUX AND EXISTS "/etc/debian_version")
|
|
||||||
set(DEBIAN TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LINUX AND EXISTS "/etc/redhat-release")
|
|
||||||
set(REDHAT TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LINUX AND EXISTS "/etc/slackware-version")
|
|
||||||
set(SLACKWARE TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# when the library suffix should be 64 (applies to redhat linux family)
|
|
||||||
########################################################################
|
|
||||||
if (REDHAT OR SLACKWARE)
|
|
||||||
set(LIB64_CONVENTION TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED LIB_SUFFIX AND LIB64_CONVENTION AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
|
|
||||||
set(LIB_SUFFIX 64)
|
|
||||||
endif()
|
|
||||||
set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
|
|
||||||
@@ -1,242 +0,0 @@
|
|||||||
# Copyright 2010-2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_PYTHON_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup the python interpreter:
|
|
||||||
# This allows the user to specify a specific interpreter,
|
|
||||||
# or finds the interpreter via the built-in cmake module.
|
|
||||||
########################################################################
|
|
||||||
#this allows the user to override PYTHON_EXECUTABLE
|
|
||||||
if(PYTHON_EXECUTABLE)
|
|
||||||
|
|
||||||
set(PYTHONINTERP_FOUND TRUE)
|
|
||||||
|
|
||||||
#otherwise if not set, try to automatically find it
|
|
||||||
else(PYTHON_EXECUTABLE)
|
|
||||||
|
|
||||||
#use the built-in find script
|
|
||||||
find_package(PythonInterp 2)
|
|
||||||
|
|
||||||
#and if that fails use the find program routine
|
|
||||||
if(NOT PYTHONINTERP_FOUND)
|
|
||||||
find_program(PYTHON_EXECUTABLE NAMES python python2 python2.7 python2.6 python2.5)
|
|
||||||
if(PYTHON_EXECUTABLE)
|
|
||||||
set(PYTHONINTERP_FOUND TRUE)
|
|
||||||
endif(PYTHON_EXECUTABLE)
|
|
||||||
endif(NOT PYTHONINTERP_FOUND)
|
|
||||||
|
|
||||||
endif(PYTHON_EXECUTABLE)
|
|
||||||
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
|
||||||
set(QA_PYTHON_EXECUTABLE "/usr/bin/python")
|
|
||||||
else (CMAKE_CROSSCOMPILING)
|
|
||||||
set(QA_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
|
|
||||||
endif(CMAKE_CROSSCOMPILING)
|
|
||||||
|
|
||||||
#make the path to the executable appear in the cmake gui
|
|
||||||
set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
|
|
||||||
set(QA_PYTHON_EXECUTABLE ${QA_PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter for QA tests")
|
|
||||||
|
|
||||||
#make sure we can use -B with python (introduced in 2.6)
|
|
||||||
if(PYTHON_EXECUTABLE)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} -B -c ""
|
|
||||||
OUTPUT_QUIET ERROR_QUIET
|
|
||||||
RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
|
|
||||||
)
|
|
||||||
if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
|
|
||||||
set(PYTHON_DASH_B "-B")
|
|
||||||
endif()
|
|
||||||
endif(PYTHON_EXECUTABLE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Check for the existence of a python module:
|
|
||||||
# - desc a string description of the check
|
|
||||||
# - mod the name of the module to import
|
|
||||||
# - cmd an additional command to run
|
|
||||||
# - have the result variable to set
|
|
||||||
########################################################################
|
|
||||||
macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
|
|
||||||
message(STATUS "")
|
|
||||||
message(STATUS "Python checking for ${desc}")
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} -c "
|
|
||||||
#########################################
|
|
||||||
try:
|
|
||||||
import ${mod}
|
|
||||||
assert ${cmd}
|
|
||||||
except ImportError, AssertionError: exit(-1)
|
|
||||||
except: pass
|
|
||||||
#########################################"
|
|
||||||
RESULT_VARIABLE ${have}
|
|
||||||
)
|
|
||||||
if(${have} EQUAL 0)
|
|
||||||
message(STATUS "Python checking for ${desc} - found")
|
|
||||||
set(${have} TRUE)
|
|
||||||
else(${have} EQUAL 0)
|
|
||||||
message(STATUS "Python checking for ${desc} - not found")
|
|
||||||
set(${have} FALSE)
|
|
||||||
endif(${have} EQUAL 0)
|
|
||||||
endmacro(GR_PYTHON_CHECK_MODULE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Sets the python installation directory GR_PYTHON_DIR
|
|
||||||
########################################################################
|
|
||||||
if(NOT DEFINED GR_PYTHON_DIR)
|
|
||||||
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
|
|
||||||
from distutils import sysconfig
|
|
||||||
print sysconfig.get_python_lib(plat_specific=True, prefix='')
|
|
||||||
" OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Create an always-built target with a unique name
|
|
||||||
# Usage: GR_UNIQUE_TARGET(<description> <dependencies list>)
|
|
||||||
########################################################################
|
|
||||||
function(GR_UNIQUE_TARGET desc)
|
|
||||||
file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
|
|
||||||
unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
|
|
||||||
print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
|
|
||||||
OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
add_custom_target(${_target} ALL DEPENDS ${ARGN})
|
|
||||||
endfunction(GR_UNIQUE_TARGET)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Install python sources (also builds and installs byte-compiled python)
|
|
||||||
########################################################################
|
|
||||||
function(GR_PYTHON_INSTALL)
|
|
||||||
include(CMakeParseArgumentsCopy)
|
|
||||||
CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
|
|
||||||
|
|
||||||
####################################################################
|
|
||||||
if(GR_PYTHON_INSTALL_FILES)
|
|
||||||
####################################################################
|
|
||||||
install(${ARGN}) #installs regular python files
|
|
||||||
|
|
||||||
#create a list of all generated files
|
|
||||||
unset(pysrcfiles)
|
|
||||||
unset(pycfiles)
|
|
||||||
unset(pyofiles)
|
|
||||||
foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
|
|
||||||
get_filename_component(pyfile ${pyfile} ABSOLUTE)
|
|
||||||
list(APPEND pysrcfiles ${pyfile})
|
|
||||||
|
|
||||||
#determine if this file is in the source or binary directory
|
|
||||||
file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
|
|
||||||
string(LENGTH "${source_rel_path}" source_rel_path_len)
|
|
||||||
file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
|
|
||||||
string(LENGTH "${binary_rel_path}" binary_rel_path_len)
|
|
||||||
|
|
||||||
#and set the generated path appropriately
|
|
||||||
if(${source_rel_path_len} GREATER ${binary_rel_path_len})
|
|
||||||
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
|
|
||||||
else()
|
|
||||||
set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
|
|
||||||
endif()
|
|
||||||
list(APPEND pycfiles ${pygenfile}c)
|
|
||||||
list(APPEND pyofiles ${pygenfile}o)
|
|
||||||
|
|
||||||
#ensure generation path exists
|
|
||||||
get_filename_component(pygen_path ${pygenfile} PATH)
|
|
||||||
file(MAKE_DIRECTORY ${pygen_path})
|
|
||||||
|
|
||||||
endforeach(pyfile)
|
|
||||||
|
|
||||||
#the command to generate the pyc files
|
|
||||||
add_custom_command(
|
|
||||||
DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
|
|
||||||
)
|
|
||||||
|
|
||||||
#the command to generate the pyo files
|
|
||||||
add_custom_command(
|
|
||||||
DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
|
|
||||||
)
|
|
||||||
|
|
||||||
#create install rule and add generated files to target list
|
|
||||||
set(python_install_gen_targets ${pycfiles} ${pyofiles})
|
|
||||||
install(FILES ${python_install_gen_targets}
|
|
||||||
DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
|
|
||||||
COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
####################################################################
|
|
||||||
elseif(GR_PYTHON_INSTALL_PROGRAMS)
|
|
||||||
####################################################################
|
|
||||||
file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
|
|
||||||
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
|
||||||
set(pyexe_native "/usr/bin/env python")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
|
|
||||||
get_filename_component(pyfile_name ${pyfile} NAME)
|
|
||||||
get_filename_component(pyfile ${pyfile} ABSOLUTE)
|
|
||||||
string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
|
|
||||||
list(APPEND python_install_gen_targets ${pyexefile})
|
|
||||||
|
|
||||||
get_filename_component(pyexefile_path ${pyexefile} PATH)
|
|
||||||
file(MAKE_DIRECTORY ${pyexefile_path})
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${pyexefile} DEPENDS ${pyfile}
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} -c
|
|
||||||
"open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+open('${pyfile}').read())"
|
|
||||||
COMMENT "Shebangin ${pyfile_name}"
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
|
|
||||||
#on windows, python files need an extension to execute
|
|
||||||
get_filename_component(pyfile_ext ${pyfile} EXT)
|
|
||||||
if(WIN32 AND NOT pyfile_ext)
|
|
||||||
set(pyfile_name "${pyfile_name}.py")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
|
|
||||||
DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
|
|
||||||
COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
|
|
||||||
)
|
|
||||||
endforeach(pyfile)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
|
|
||||||
|
|
||||||
endfunction(GR_PYTHON_INSTALL)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Write the python helper script that generates byte code files
|
|
||||||
########################################################################
|
|
||||||
file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
|
|
||||||
import sys, py_compile
|
|
||||||
files = sys.argv[1:]
|
|
||||||
srcs, gens = files[:len(files)/2], files[len(files)/2:]
|
|
||||||
for src, gen in zip(srcs, gens):
|
|
||||||
py_compile.compile(file=src, cfile=gen, doraise=True)
|
|
||||||
")
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
# Copyright 2010-2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_SWIG_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_SWIG_CMAKE TRUE)
|
|
||||||
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Builds a swig documentation file to be generated into python docstrings
|
|
||||||
# Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
|
|
||||||
#
|
|
||||||
# Set the following variable to specify extra dependent targets:
|
|
||||||
# - GR_SWIG_DOCS_SOURCE_DEPS
|
|
||||||
# - GR_SWIG_DOCS_TARGET_DEPS
|
|
||||||
########################################################################
|
|
||||||
function(GR_SWIG_MAKE_DOCS output_file)
|
|
||||||
if(ENABLE_DOXYGEN)
|
|
||||||
|
|
||||||
#setup the input files variable list, quote formated
|
|
||||||
set(input_files)
|
|
||||||
unset(INPUT_PATHS)
|
|
||||||
foreach(input_path ${ARGN})
|
|
||||||
if (IS_DIRECTORY ${input_path}) #when input path is a directory
|
|
||||||
file(GLOB input_path_h_files ${input_path}/*.h)
|
|
||||||
else() #otherwise its just a file, no glob
|
|
||||||
set(input_path_h_files ${input_path})
|
|
||||||
endif()
|
|
||||||
list(APPEND input_files ${input_path_h_files})
|
|
||||||
set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
|
|
||||||
endforeach(input_path)
|
|
||||||
|
|
||||||
#determine the output directory
|
|
||||||
get_filename_component(name ${output_file} NAME_WE)
|
|
||||||
get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
|
|
||||||
set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
|
|
||||||
make_directory(${OUTPUT_DIRECTORY})
|
|
||||||
|
|
||||||
#generate the Doxyfile used by doxygen
|
|
||||||
configure_file(
|
|
||||||
${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
|
|
||||||
${OUTPUT_DIRECTORY}/Doxyfile
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
#Create a dummy custom command that depends on other targets
|
|
||||||
include(GrMiscUtils)
|
|
||||||
GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
|
|
||||||
|
|
||||||
#call doxygen on the Doxyfile + input headers
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
|
|
||||||
DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
|
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
|
|
||||||
COMMENT "Generating doxygen xml for ${name} docs"
|
|
||||||
)
|
|
||||||
|
|
||||||
#call the swig_doc script on the xml files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${output_file}
|
|
||||||
DEPENDS ${input_files} ${stamp-file} ${OUTPUT_DIRECTORY}/xml/index.xml
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
|
|
||||||
${OUTPUT_DIRECTORY}/xml
|
|
||||||
${output_file}
|
|
||||||
COMMENT "Generating python docstrings for ${name}"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
|
|
||||||
)
|
|
||||||
|
|
||||||
else(ENABLE_DOXYGEN)
|
|
||||||
file(WRITE ${output_file} "\n") #no doxygen -> empty file
|
|
||||||
endif(ENABLE_DOXYGEN)
|
|
||||||
endfunction(GR_SWIG_MAKE_DOCS)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Build a swig target for the common gnuradio use case. Usage:
|
|
||||||
# GR_SWIG_MAKE(target ifile ifile ifile...)
|
|
||||||
#
|
|
||||||
# Set the following variables before calling:
|
|
||||||
# - GR_SWIG_FLAGS
|
|
||||||
# - GR_SWIG_INCLUDE_DIRS
|
|
||||||
# - GR_SWIG_LIBRARIES
|
|
||||||
# - GR_SWIG_SOURCE_DEPS
|
|
||||||
# - GR_SWIG_TARGET_DEPS
|
|
||||||
# - GR_SWIG_DOC_FILE
|
|
||||||
# - GR_SWIG_DOC_DIRS
|
|
||||||
########################################################################
|
|
||||||
macro(GR_SWIG_MAKE name)
|
|
||||||
set(ifiles ${ARGN})
|
|
||||||
|
|
||||||
# Shimming this in here to take care of a SWIG bug with handling
|
|
||||||
# vector<size_t> and vector<unsigned int> (on 32-bit machines) and
|
|
||||||
# vector<long unsigned int> (on 64-bit machines). Use this to test
|
|
||||||
# the size of size_t, then set SIZE_T_32 if it's a 32-bit machine
|
|
||||||
# or not if it's 64-bit. The logic in gr_type.i handles the rest.
|
|
||||||
INCLUDE (CheckTypeSize)
|
|
||||||
CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
|
|
||||||
CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
|
|
||||||
if(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
|
|
||||||
list(APPEND GR_SWIG_FLAGS -DSIZE_T_32)
|
|
||||||
endif(${SIZEOF_SIZE_T} EQUAL ${SIZEOF_UINT})
|
|
||||||
|
|
||||||
#do swig doc generation if specified
|
|
||||||
if (GR_SWIG_DOC_FILE)
|
|
||||||
set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
|
|
||||||
list(APPEND GR_SWIG_DOCS_TARGET_DEPS ${GR_SWIG_TARGET_DEPS})
|
|
||||||
GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
|
|
||||||
add_custom_target(${name}_swig_doc DEPENDS ${GR_SWIG_DOC_FILE})
|
|
||||||
list(APPEND GR_SWIG_TARGET_DEPS ${name}_swig_doc ${GR_RUNTIME_SWIG_DOC_FILE})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#append additional include directories
|
|
||||||
find_package(PythonLibs 2)
|
|
||||||
list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
|
|
||||||
list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
#prepend local swig directories
|
|
||||||
list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
list(INSERT GR_SWIG_INCLUDE_DIRS 0 ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
|
|
||||||
#determine include dependencies for swig file
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE}
|
|
||||||
${CMAKE_BINARY_DIR}/get_swig_deps.py
|
|
||||||
"${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
#Create a dummy custom command that depends on other targets
|
|
||||||
include(GrMiscUtils)
|
|
||||||
GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
|
|
||||||
set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${tag_file}
|
|
||||||
DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
|
|
||||||
)
|
|
||||||
|
|
||||||
#append the specified include directories
|
|
||||||
include_directories(${GR_SWIG_INCLUDE_DIRS})
|
|
||||||
list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
|
|
||||||
|
|
||||||
#setup the swig flags with flags and include directories
|
|
||||||
set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
|
|
||||||
foreach(dir ${GR_SWIG_INCLUDE_DIRS})
|
|
||||||
list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
|
|
||||||
endforeach(dir)
|
|
||||||
|
|
||||||
#set the C++ property on the swig .i file so it builds
|
|
||||||
set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
|
|
||||||
|
|
||||||
#setup the actual swig library target to be built
|
|
||||||
include(UseSWIG)
|
|
||||||
SWIG_ADD_MODULE(${name} python ${ifiles})
|
|
||||||
SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES})
|
|
||||||
|
|
||||||
endmacro(GR_SWIG_MAKE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Install swig targets generated by GR_SWIG_MAKE. Usage:
|
|
||||||
# GR_SWIG_INSTALL(
|
|
||||||
# TARGETS target target target...
|
|
||||||
# [DESTINATION destination]
|
|
||||||
# [COMPONENT component]
|
|
||||||
# )
|
|
||||||
########################################################################
|
|
||||||
macro(GR_SWIG_INSTALL)
|
|
||||||
|
|
||||||
include(CMakeParseArgumentsCopy)
|
|
||||||
CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
|
|
||||||
|
|
||||||
foreach(name ${GR_SWIG_INSTALL_TARGETS})
|
|
||||||
install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
|
|
||||||
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
|
||||||
COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
|
|
||||||
)
|
|
||||||
|
|
||||||
include(GrPython)
|
|
||||||
GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
|
|
||||||
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
|
||||||
COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
|
|
||||||
)
|
|
||||||
|
|
||||||
GR_LIBTOOL(
|
|
||||||
TARGET ${SWIG_MODULE_${name}_REAL_NAME}
|
|
||||||
DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
|
|
||||||
)
|
|
||||||
|
|
||||||
endforeach(name)
|
|
||||||
|
|
||||||
endmacro(GR_SWIG_INSTALL)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Generate a python file that can determine swig dependencies.
|
|
||||||
# Used by the make macro above to determine extra dependencies.
|
|
||||||
# When you build C++, CMake figures out the header dependencies.
|
|
||||||
# This code essentially performs that logic for swig includes.
|
|
||||||
########################################################################
|
|
||||||
file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
|
|
||||||
|
|
||||||
import os, sys, re
|
|
||||||
|
|
||||||
i_include_matcher = re.compile('%(include|import)\\s*[<|\"](.*)[>|\"]')
|
|
||||||
h_include_matcher = re.compile('#(include)\\s*[<|\"](.*)[>|\"]')
|
|
||||||
include_dirs = sys.argv[2].split(';')
|
|
||||||
|
|
||||||
def get_swig_incs(file_path):
|
|
||||||
if file_path.endswith('.i'): matcher = i_include_matcher
|
|
||||||
else: matcher = h_include_matcher
|
|
||||||
file_contents = open(file_path, 'r').read()
|
|
||||||
return matcher.findall(file_contents, re.MULTILINE)
|
|
||||||
|
|
||||||
def get_swig_deps(file_path, level):
|
|
||||||
deps = [file_path]
|
|
||||||
if level == 0: return deps
|
|
||||||
for keyword, inc_file in get_swig_incs(file_path):
|
|
||||||
for inc_dir in include_dirs:
|
|
||||||
inc_path = os.path.join(inc_dir, inc_file)
|
|
||||||
if not os.path.exists(inc_path): continue
|
|
||||||
deps.extend(get_swig_deps(inc_path, level-1))
|
|
||||||
break #found, we dont search in lower prio inc dirs
|
|
||||||
return deps
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
ifiles = sys.argv[1].split(';')
|
|
||||||
deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
|
|
||||||
#sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
|
|
||||||
print(';'.join(set(deps)))
|
|
||||||
")
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
# Copyright 2010-2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_TEST_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_TEST_CMAKE TRUE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Add a unit test and setup the environment for a unit test.
|
|
||||||
# Takes the same arguments as the ADD_TEST function.
|
|
||||||
#
|
|
||||||
# Before calling set the following variables:
|
|
||||||
# GR_TEST_TARGET_DEPS - built targets for the library path
|
|
||||||
# GR_TEST_LIBRARY_DIRS - directories for the library path
|
|
||||||
# GR_TEST_PYTHON_DIRS - directories for the python path
|
|
||||||
# GR_TEST_ENVIRONS - other environment key/value pairs
|
|
||||||
########################################################################
|
|
||||||
function(GR_ADD_TEST test_name)
|
|
||||||
|
|
||||||
#Ensure that the build exe also appears in the PATH.
|
|
||||||
list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
|
|
||||||
|
|
||||||
#In the land of windows, all libraries must be in the PATH.
|
|
||||||
#Since the dependent libraries are not yet installed,
|
|
||||||
#we must manually set them in the PATH to run tests.
|
|
||||||
#The following appends the path of a target dependency.
|
|
||||||
foreach(target ${GR_TEST_TARGET_DEPS})
|
|
||||||
get_target_property(location ${target} LOCATION)
|
|
||||||
if(location)
|
|
||||||
get_filename_component(path ${location} PATH)
|
|
||||||
string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
|
|
||||||
list(APPEND GR_TEST_LIBRARY_DIRS ${path})
|
|
||||||
endif(location)
|
|
||||||
endforeach(target)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
#SWIG generates the python library files into a subdirectory.
|
|
||||||
#Therefore, we must append this subdirectory into PYTHONPATH.
|
|
||||||
#Only do this for the python directories matching the following:
|
|
||||||
foreach(pydir ${GR_TEST_PYTHON_DIRS})
|
|
||||||
get_filename_component(name ${pydir} NAME)
|
|
||||||
if(name MATCHES "^(swig|lib|src)$")
|
|
||||||
list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
|
|
||||||
endif()
|
|
||||||
endforeach(pydir)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
|
|
||||||
file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
|
|
||||||
file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
|
|
||||||
|
|
||||||
set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
|
|
||||||
list(APPEND environs ${GR_TEST_ENVIRONS})
|
|
||||||
|
|
||||||
#http://www.cmake.org/pipermail/cmake/2009-May/029464.html
|
|
||||||
#Replaced this add test + set environs code with the shell script generation.
|
|
||||||
#Its nicer to be able to manually run the shell script to diagnose problems.
|
|
||||||
#ADD_TEST(${ARGV})
|
|
||||||
#SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
|
|
||||||
|
|
||||||
if(UNIX)
|
|
||||||
set(LD_PATH_VAR "LD_LIBRARY_PATH")
|
|
||||||
if(APPLE)
|
|
||||||
set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
|
|
||||||
list(APPEND libpath "$${LD_PATH_VAR}")
|
|
||||||
list(APPEND pypath "$PYTHONPATH")
|
|
||||||
|
|
||||||
#replace list separator with the path separator
|
|
||||||
string(REPLACE ";" ":" libpath "${libpath}")
|
|
||||||
string(REPLACE ";" ":" pypath "${pypath}")
|
|
||||||
list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
|
|
||||||
|
|
||||||
#generate a bat file that sets the environment and runs the test
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
|
||||||
set(SHELL "/bin/sh")
|
|
||||||
else(CMAKE_CROSSCOMPILING)
|
|
||||||
find_program(SHELL sh)
|
|
||||||
endif(CMAKE_CROSSCOMPILING)
|
|
||||||
set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
|
|
||||||
file(WRITE ${sh_file} "#!${SHELL}\n")
|
|
||||||
#each line sets an environment variable
|
|
||||||
foreach(environ ${environs})
|
|
||||||
file(APPEND ${sh_file} "export ${environ}\n")
|
|
||||||
endforeach(environ)
|
|
||||||
#load the command to run with its arguments
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
file(APPEND ${sh_file} "${arg} ")
|
|
||||||
endforeach(arg)
|
|
||||||
file(APPEND ${sh_file} "\n")
|
|
||||||
|
|
||||||
#make the shell file executable
|
|
||||||
execute_process(COMMAND chmod +x ${sh_file})
|
|
||||||
|
|
||||||
add_test(${test_name} ${SHELL} ${sh_file})
|
|
||||||
|
|
||||||
endif(UNIX)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
list(APPEND libpath ${DLL_PATHS} "%PATH%")
|
|
||||||
list(APPEND pypath "%PYTHONPATH%")
|
|
||||||
|
|
||||||
#replace list separator with the path separator (escaped)
|
|
||||||
string(REPLACE ";" "\\;" libpath "${libpath}")
|
|
||||||
string(REPLACE ";" "\\;" pypath "${pypath}")
|
|
||||||
list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
|
|
||||||
|
|
||||||
#generate a bat file that sets the environment and runs the test
|
|
||||||
set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
|
|
||||||
file(WRITE ${bat_file} "@echo off\n")
|
|
||||||
#each line sets an environment variable
|
|
||||||
foreach(environ ${environs})
|
|
||||||
file(APPEND ${bat_file} "SET ${environ}\n")
|
|
||||||
endforeach(environ)
|
|
||||||
#load the command to run with its arguments
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
file(APPEND ${bat_file} "${arg} ")
|
|
||||||
endforeach(arg)
|
|
||||||
file(APPEND ${bat_file} "\n")
|
|
||||||
|
|
||||||
add_test(${test_name} ${bat_file})
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
endfunction(GR_ADD_TEST)
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
# Copyright 2011,2013 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_VERSION_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_VERSION_CMAKE TRUE)
|
|
||||||
|
|
||||||
#eventually, replace version.sh and fill in the variables below
|
|
||||||
set(MAJOR_VERSION ${VERSION_INFO_MAJOR_VERSION})
|
|
||||||
set(API_COMPAT ${VERSION_INFO_API_COMPAT})
|
|
||||||
set(MINOR_VERSION ${VERSION_INFO_MINOR_VERSION})
|
|
||||||
set(MAINT_VERSION ${VERSION_INFO_MAINT_VERSION})
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Extract the version string from git describe.
|
|
||||||
########################################################################
|
|
||||||
find_package(Git)
|
|
||||||
|
|
||||||
if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
|
|
||||||
message(STATUS "Extracting version information from git describe...")
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} describe --always --abbrev=8 --long
|
|
||||||
OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
set(GIT_DESCRIBE "v${MAJOR_VERSION}.${API_COMPAT}.x-xxx-xunknown")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Use the logic below to set the version constants
|
|
||||||
########################################################################
|
|
||||||
if("${MINOR_VERSION}" STREQUAL "git")
|
|
||||||
# VERSION: 3.3git-xxx-gxxxxxxxx
|
|
||||||
# DOCVER: 3.3git
|
|
||||||
# LIBVER: 3.3git
|
|
||||||
set(VERSION "${GIT_DESCRIBE}")
|
|
||||||
set(DOCVER "${MAJOR_VERSION}.${API_COMPAT}${MINOR_VERSION}")
|
|
||||||
set(LIBVER "${MAJOR_VERSION}.${API_COMPAT}${MINOR_VERSION}")
|
|
||||||
set(RC_MINOR_VERSION "0")
|
|
||||||
set(RC_MAINT_VERSION "0")
|
|
||||||
elseif("${MAINT_VERSION}" STREQUAL "git")
|
|
||||||
# VERSION: 3.3.1git-xxx-gxxxxxxxx
|
|
||||||
# DOCVER: 3.3.1git
|
|
||||||
# LIBVER: 3.3.1git
|
|
||||||
set(VERSION "${GIT_DESCRIBE}")
|
|
||||||
set(DOCVER "${MAJOR_VERSION}.${API_COMPAT}.${MINOR_VERSION}${MAINT_VERSION}")
|
|
||||||
set(LIBVER "${MAJOR_VERSION}.${API_COMPAT}.${MINOR_VERSION}${MAINT_VERSION}")
|
|
||||||
math(EXPR RC_MINOR_VERSION "${MINOR_VERSION} - 1")
|
|
||||||
set(RC_MAINT_VERSION "0")
|
|
||||||
else()
|
|
||||||
# This is a numbered release.
|
|
||||||
# VERSION: 3.3.1{.x}
|
|
||||||
# DOCVER: 3.3.1{.x}
|
|
||||||
# LIBVER: 3.3.1{.x}
|
|
||||||
if("${MAINT_VERSION}" STREQUAL "0")
|
|
||||||
set(VERSION "${MAJOR_VERSION}.${API_COMPAT}.${MINOR_VERSION}")
|
|
||||||
else()
|
|
||||||
set(VERSION "${MAJOR_VERSION}.${API_COMPAT}.${MINOR_VERSION}.${MAINT_VERSION}")
|
|
||||||
endif()
|
|
||||||
set(DOCVER "${VERSION}")
|
|
||||||
set(LIBVER "${VERSION}")
|
|
||||||
set(RC_MINOR_VERSION ${MINOR_VERSION})
|
|
||||||
set(RC_MAINT_VERSION ${MAINT_VERSION})
|
|
||||||
endif()
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
PKG_CHECK_MODULES(PC_IEEE802_11 ieee802_11)
|
||||||
|
|
||||||
|
FIND_PATH(
|
||||||
|
IEEE802_11_INCLUDE_DIRS
|
||||||
|
NAMES ieee802-11/api.h
|
||||||
|
HINTS $ENV{IEEE802_11_DIR}/include
|
||||||
|
${PC_IEEE802_11_INCLUDEDIR}
|
||||||
|
PATHS ${CMAKE_INSTALL_PREFIX}/include
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(
|
||||||
|
IEEE802_11_LIBRARIES
|
||||||
|
NAMES gnuradio-ieee802_11
|
||||||
|
HINTS $ENV{IEEE802_11_DIR}/lib
|
||||||
|
${PC_IEEE802_11_LIBDIR}
|
||||||
|
PATHS ${CMAKE_INSTALL_PREFIX}/lib
|
||||||
|
${CMAKE_INSTALL_PREFIX}/lib64
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/lib
|
||||||
|
/usr/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/ieee802_11Target.cmake")
|
||||||
|
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(IEEE802_11 DEFAULT_MSG IEEE802_11_LIBRARIES IEEE802_11_INCLUDE_DIRS)
|
||||||
|
MARK_AS_ADVANCED(IEEE802_11_LIBRARIES IEEE802_11_INCLUDE_DIRS)
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
#
|
# Copyright 2018 Free Software Foundation, Inc.
|
||||||
# Copyright 2004 Free Software Foundation, Inc.
|
|
||||||
#
|
#
|
||||||
# This file is part of GNU Radio
|
# This file is part of GNU Radio
|
||||||
#
|
#
|
||||||
@@ -17,36 +16,11 @@
|
|||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
# along with GNU Radio; see the file COPYING. If not, write to
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
# Boston, MA 02110-1301, USA.
|
# Boston, MA 02110-1301, USA.
|
||||||
#
|
|
||||||
|
|
||||||
def i_code (code3):
|
include(CMakeFindDependencyMacro)
|
||||||
return code3[0]
|
|
||||||
|
|
||||||
def o_code (code3):
|
set(target_deps "@TARGET_DEPENDENCIES@")
|
||||||
if len (code3) >= 2:
|
foreach(dep IN LISTS target_deps)
|
||||||
return code3[1]
|
find_dependency(${dep})
|
||||||
else:
|
endforeach()
|
||||||
return code3[0]
|
include("${CMAKE_CURRENT_LIST_DIR}/@TARGET@Targets.cmake")
|
||||||
|
|
||||||
def tap_code (code3):
|
|
||||||
if len (code3) >= 3:
|
|
||||||
return code3[2]
|
|
||||||
else:
|
|
||||||
return code3[0]
|
|
||||||
|
|
||||||
def i_type (code3):
|
|
||||||
return char_to_type[i_code (code3)]
|
|
||||||
|
|
||||||
def o_type (code3):
|
|
||||||
return char_to_type[o_code (code3)]
|
|
||||||
|
|
||||||
def tap_type (code3):
|
|
||||||
return char_to_type[tap_code (code3)]
|
|
||||||
|
|
||||||
|
|
||||||
char_to_type = {}
|
|
||||||
char_to_type['s'] = 'short'
|
|
||||||
char_to_type['i'] = 'int'
|
|
||||||
char_to_type['f'] = 'float'
|
|
||||||
char_to_type['c'] = 'gr_complex'
|
|
||||||
char_to_type['b'] = 'unsigned char'
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# Copyright 2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Create the doxygen configuration file
|
|
||||||
########################################################################
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir)
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
|
|
||||||
|
|
||||||
set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
|
|
||||||
set(enable_html_docs YES)
|
|
||||||
set(enable_latex_docs NO)
|
|
||||||
set(enable_xml_docs YES)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Make and install doxygen docs
|
|
||||||
########################################################################
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${BUILT_DIRS}
|
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "Generating documentation with doxygen"
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS})
|
|
||||||
|
|
||||||
install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR})
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
|||||||
/Makefile
|
|
||||||
/Makefile.in
|
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2007,2009,2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
|
|
||||||
include $(top_srcdir)/Makefile.common
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
example/aadvark.cc \
|
|
||||||
example/aadvark.h \
|
|
||||||
example/Doxyfile \
|
|
||||||
example/xml/aadvark_8cc.xml \
|
|
||||||
example/xml/aadvark_8h.xml \
|
|
||||||
example/xml/classAadvark.xml \
|
|
||||||
example/xml/combine.xslt \
|
|
||||||
example/xml/compound.xsd \
|
|
||||||
example/xml/index.xml \
|
|
||||||
example/xml/index.xsd
|
|
||||||
|
|
||||||
if PYTHON
|
|
||||||
utilspythondir = $(grpythondir)/doxyxml
|
|
||||||
|
|
||||||
TESTS = \
|
|
||||||
run_tests
|
|
||||||
|
|
||||||
nobase_utilspython_PYTHON = \
|
|
||||||
__init__.py \
|
|
||||||
base.py \
|
|
||||||
doxyindex.py \
|
|
||||||
text.py \
|
|
||||||
generated/__init__.py \
|
|
||||||
generated/index.py \
|
|
||||||
generated/indexsuper.py \
|
|
||||||
generated/compound.py \
|
|
||||||
generated/compoundsuper.py
|
|
||||||
endif
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
Python interface to contents of doxygen xml documentation.
|
|
||||||
|
|
||||||
Example use:
|
|
||||||
See the contents of the example folder for the C++ and
|
|
||||||
doxygen-generated xml used in this example.
|
|
||||||
|
|
||||||
>>> # Parse the doxygen docs.
|
|
||||||
>>> import os
|
|
||||||
>>> this_dir = os.path.dirname(globals()['__file__'])
|
|
||||||
>>> xml_path = this_dir + "/example/xml/"
|
|
||||||
>>> di = DoxyIndex(xml_path)
|
|
||||||
|
|
||||||
Get a list of all top-level objects.
|
|
||||||
|
|
||||||
>>> print([mem.name() for mem in di.members()])
|
|
||||||
[u'Aadvark', u'aadvarky_enough', u'main']
|
|
||||||
|
|
||||||
Get all functions.
|
|
||||||
|
|
||||||
>>> print([mem.name() for mem in di.in_category(DoxyFunction)])
|
|
||||||
[u'aadvarky_enough', u'main']
|
|
||||||
|
|
||||||
Check if an object is present.
|
|
||||||
|
|
||||||
>>> di.has_member(u'Aadvark')
|
|
||||||
True
|
|
||||||
>>> di.has_member(u'Fish')
|
|
||||||
False
|
|
||||||
|
|
||||||
Get an item by name and check its properties.
|
|
||||||
|
|
||||||
>>> aad = di.get_member(u'Aadvark')
|
|
||||||
>>> print(aad.brief_description)
|
|
||||||
Models the mammal Aadvark.
|
|
||||||
>>> print(aad.detailed_description)
|
|
||||||
Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
|
|
||||||
<BLANKLINE>
|
|
||||||
This line is uninformative and is only to test line breaks in the comments.
|
|
||||||
>>> [mem.name() for mem in aad.members()]
|
|
||||||
[u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness']
|
|
||||||
>>> aad.get_member(u'print').brief_description
|
|
||||||
u'Outputs the vital aadvark statistics.'
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
|
|
||||||
|
|
||||||
def _test():
|
|
||||||
import os
|
|
||||||
this_dir = os.path.dirname(globals()['__file__'])
|
|
||||||
xml_path = this_dir + "/example/xml/"
|
|
||||||
di = DoxyIndex(xml_path)
|
|
||||||
# Get the Aadvark class
|
|
||||||
aad = di.get_member('Aadvark')
|
|
||||||
aad.brief_description
|
|
||||||
import doctest
|
|
||||||
return doctest.testmod()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
_test()
|
|
||||||
|
|
||||||
@@ -1,219 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
A base class is created.
|
|
||||||
|
|
||||||
Classes based upon this are used to make more user-friendly interfaces
|
|
||||||
to the doxygen xml docs than the generated classes provide.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import pdb
|
|
||||||
|
|
||||||
from xml.parsers.expat import ExpatError
|
|
||||||
|
|
||||||
from generated import compound
|
|
||||||
|
|
||||||
|
|
||||||
class Base(object):
|
|
||||||
|
|
||||||
class Duplicate(StandardError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class NoSuchMember(StandardError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class ParsingError(StandardError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __init__(self, parse_data, top=None):
|
|
||||||
self._parsed = False
|
|
||||||
self._error = False
|
|
||||||
self._parse_data = parse_data
|
|
||||||
self._members = []
|
|
||||||
self._dict_members = {}
|
|
||||||
self._in_category = {}
|
|
||||||
self._data = {}
|
|
||||||
if top is not None:
|
|
||||||
self._xml_path = top._xml_path
|
|
||||||
# Set up holder of references
|
|
||||||
else:
|
|
||||||
top = self
|
|
||||||
self._refs = {}
|
|
||||||
self._xml_path = parse_data
|
|
||||||
self.top = top
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_refid(cls, refid, top=None):
|
|
||||||
""" Instantiate class from a refid rather than parsing object. """
|
|
||||||
# First check to see if its already been instantiated.
|
|
||||||
if top is not None and refid in top._refs:
|
|
||||||
return top._refs[refid]
|
|
||||||
# Otherwise create a new instance and set refid.
|
|
||||||
inst = cls(None, top=top)
|
|
||||||
inst.refid = refid
|
|
||||||
inst.add_ref(inst)
|
|
||||||
return inst
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_parse_data(cls, parse_data, top=None):
|
|
||||||
refid = getattr(parse_data, 'refid', None)
|
|
||||||
if refid is not None and top is not None and refid in top._refs:
|
|
||||||
return top._refs[refid]
|
|
||||||
inst = cls(parse_data, top=top)
|
|
||||||
if refid is not None:
|
|
||||||
inst.refid = refid
|
|
||||||
inst.add_ref(inst)
|
|
||||||
return inst
|
|
||||||
|
|
||||||
def add_ref(self, obj):
|
|
||||||
if hasattr(obj, 'refid'):
|
|
||||||
self.top._refs[obj.refid] = obj
|
|
||||||
|
|
||||||
mem_classes = []
|
|
||||||
|
|
||||||
def get_cls(self, mem):
|
|
||||||
for cls in self.mem_classes:
|
|
||||||
if cls.can_parse(mem):
|
|
||||||
return cls
|
|
||||||
raise StandardError(("Did not find a class for object '%s'." \
|
|
||||||
% (mem.get_name())))
|
|
||||||
|
|
||||||
def convert_mem(self, mem):
|
|
||||||
try:
|
|
||||||
cls = self.get_cls(mem)
|
|
||||||
converted = cls.from_parse_data(mem, self.top)
|
|
||||||
if converted is None:
|
|
||||||
raise StandardError('No class matched this object.')
|
|
||||||
self.add_ref(converted)
|
|
||||||
return converted
|
|
||||||
except StandardError, e:
|
|
||||||
print e
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def includes(cls, inst):
|
|
||||||
return isinstance(inst, cls)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def can_parse(cls, obj):
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
self._parsed = True
|
|
||||||
|
|
||||||
def _get_dict_members(self, cat=None):
|
|
||||||
"""
|
|
||||||
For given category a dictionary is returned mapping member names to
|
|
||||||
members of that category. For names that are duplicated the name is
|
|
||||||
mapped to None.
|
|
||||||
"""
|
|
||||||
self.confirm_no_error()
|
|
||||||
if cat not in self._dict_members:
|
|
||||||
new_dict = {}
|
|
||||||
for mem in self.in_category(cat):
|
|
||||||
if mem.name() not in new_dict:
|
|
||||||
new_dict[mem.name()] = mem
|
|
||||||
else:
|
|
||||||
new_dict[mem.name()] = self.Duplicate
|
|
||||||
self._dict_members[cat] = new_dict
|
|
||||||
return self._dict_members[cat]
|
|
||||||
|
|
||||||
def in_category(self, cat):
|
|
||||||
self.confirm_no_error()
|
|
||||||
if cat is None:
|
|
||||||
return self._members
|
|
||||||
if cat not in self._in_category:
|
|
||||||
self._in_category[cat] = [mem for mem in self._members
|
|
||||||
if cat.includes(mem)]
|
|
||||||
return self._in_category[cat]
|
|
||||||
|
|
||||||
def get_member(self, name, cat=None):
|
|
||||||
self.confirm_no_error()
|
|
||||||
# Check if it's in a namespace or class.
|
|
||||||
bits = name.split('::')
|
|
||||||
first = bits[0]
|
|
||||||
rest = '::'.join(bits[1:])
|
|
||||||
member = self._get_dict_members(cat).get(first, self.NoSuchMember)
|
|
||||||
# Raise any errors that are returned.
|
|
||||||
if member in set([self.NoSuchMember, self.Duplicate]):
|
|
||||||
raise member()
|
|
||||||
if rest:
|
|
||||||
return member.get_member(rest, cat=cat)
|
|
||||||
return member
|
|
||||||
|
|
||||||
def has_member(self, name, cat=None):
|
|
||||||
try:
|
|
||||||
mem = self.get_member(name, cat=cat)
|
|
||||||
return True
|
|
||||||
except self.NoSuchMember:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def data(self):
|
|
||||||
self.confirm_no_error()
|
|
||||||
return self._data
|
|
||||||
|
|
||||||
def members(self):
|
|
||||||
self.confirm_no_error()
|
|
||||||
return self._members
|
|
||||||
|
|
||||||
def process_memberdefs(self):
|
|
||||||
mdtss = []
|
|
||||||
for sec in self._retrieved_data.compounddef.sectiondef:
|
|
||||||
mdtss += sec.memberdef
|
|
||||||
# At the moment we lose all information associated with sections.
|
|
||||||
# Sometimes a memberdef is in several sectiondef.
|
|
||||||
# We make sure we don't get duplicates here.
|
|
||||||
uniques = set([])
|
|
||||||
for mem in mdtss:
|
|
||||||
converted = self.convert_mem(mem)
|
|
||||||
pair = (mem.name, mem.__class__)
|
|
||||||
if pair not in uniques:
|
|
||||||
uniques.add(pair)
|
|
||||||
self._members.append(converted)
|
|
||||||
|
|
||||||
def retrieve_data(self):
|
|
||||||
filename = os.path.join(self._xml_path, self.refid + '.xml')
|
|
||||||
try:
|
|
||||||
self._retrieved_data = compound.parse(filename)
|
|
||||||
except ExpatError:
|
|
||||||
print('Error in xml in file %s' % filename)
|
|
||||||
self._error = True
|
|
||||||
self._retrieved_data = None
|
|
||||||
|
|
||||||
def check_parsed(self):
|
|
||||||
if not self._parsed:
|
|
||||||
self._parse()
|
|
||||||
|
|
||||||
def confirm_no_error(self):
|
|
||||||
self.check_parsed()
|
|
||||||
if self._error:
|
|
||||||
raise self.ParsingError()
|
|
||||||
|
|
||||||
def error(self):
|
|
||||||
self.check_parsed()
|
|
||||||
return self._error
|
|
||||||
|
|
||||||
def name(self):
|
|
||||||
# first see if we can do it without processing.
|
|
||||||
if self._parse_data is not None:
|
|
||||||
return self._parse_data.name
|
|
||||||
self.check_parsed()
|
|
||||||
return self._retrieved_data.compounddef.name
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
Classes providing more user-friendly interfaces to the doxygen xml
|
|
||||||
docs than the generated classes provide.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from generated import index
|
|
||||||
from base import Base
|
|
||||||
from text import description
|
|
||||||
|
|
||||||
class DoxyIndex(Base):
|
|
||||||
"""
|
|
||||||
Parses a doxygen xml directory.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyIndex, self)._parse()
|
|
||||||
self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
|
|
||||||
for mem in self._root.compound:
|
|
||||||
converted = self.convert_mem(mem)
|
|
||||||
# For files we want the contents to be accessible directly
|
|
||||||
# from the parent rather than having to go through the file
|
|
||||||
# object.
|
|
||||||
if self.get_cls(mem) == DoxyFile:
|
|
||||||
if mem.name.endswith('.h'):
|
|
||||||
self._members += converted.members()
|
|
||||||
self._members.append(converted)
|
|
||||||
else:
|
|
||||||
self._members.append(converted)
|
|
||||||
|
|
||||||
|
|
||||||
def generate_swig_doc_i(self):
|
|
||||||
"""
|
|
||||||
%feature("docstring") gr_make_align_on_samplenumbers_ss::align_state "
|
|
||||||
Wraps the C++: gr_align_on_samplenumbers_ss::align_state";
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyCompMem(Base):
|
|
||||||
|
|
||||||
|
|
||||||
kind = None
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(DoxyCompMem, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def can_parse(cls, obj):
|
|
||||||
return obj.kind == cls.kind
|
|
||||||
|
|
||||||
def set_descriptions(self, parse_data):
|
|
||||||
bd = description(getattr(parse_data, 'briefdescription', None))
|
|
||||||
dd = description(getattr(parse_data, 'detaileddescription', None))
|
|
||||||
self._data['brief_description'] = bd
|
|
||||||
self._data['detailed_description'] = dd
|
|
||||||
|
|
||||||
class DoxyCompound(DoxyCompMem):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class DoxyMember(DoxyCompMem):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyFunction(DoxyMember):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'function'
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyFunction, self)._parse()
|
|
||||||
self.set_descriptions(self._parse_data)
|
|
||||||
self._data['params'] = []
|
|
||||||
prms = self._parse_data.param
|
|
||||||
for prm in prms:
|
|
||||||
self._data['params'].append(DoxyParam(prm))
|
|
||||||
|
|
||||||
brief_description = property(lambda self: self.data()['brief_description'])
|
|
||||||
detailed_description = property(lambda self: self.data()['detailed_description'])
|
|
||||||
params = property(lambda self: self.data()['params'])
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyFunction)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyParam(DoxyMember):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyParam, self)._parse()
|
|
||||||
self.set_descriptions(self._parse_data)
|
|
||||||
self._data['declname'] = self._parse_data.declname
|
|
||||||
|
|
||||||
brief_description = property(lambda self: self.data()['brief_description'])
|
|
||||||
detailed_description = property(lambda self: self.data()['detailed_description'])
|
|
||||||
declname = property(lambda self: self.data()['declname'])
|
|
||||||
|
|
||||||
class DoxyClass(DoxyCompound):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'class'
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyClass, self)._parse()
|
|
||||||
self.retrieve_data()
|
|
||||||
if self._error:
|
|
||||||
return
|
|
||||||
self.set_descriptions(self._retrieved_data.compounddef)
|
|
||||||
# Sectiondef.kind tells about whether private or public.
|
|
||||||
# We just ignore this for now.
|
|
||||||
self.process_memberdefs()
|
|
||||||
|
|
||||||
brief_description = property(lambda self: self.data()['brief_description'])
|
|
||||||
detailed_description = property(lambda self: self.data()['detailed_description'])
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyClass)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyFile(DoxyCompound):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'file'
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyFile, self)._parse()
|
|
||||||
self.retrieve_data()
|
|
||||||
self.set_descriptions(self._retrieved_data.compounddef)
|
|
||||||
if self._error:
|
|
||||||
return
|
|
||||||
self.process_memberdefs()
|
|
||||||
|
|
||||||
brief_description = property(lambda self: self.data()['brief_description'])
|
|
||||||
detailed_description = property(lambda self: self.data()['detailed_description'])
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyFile)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyNamespace(DoxyCompound):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'namespace'
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyNamespace)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyGroup(DoxyCompound):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'group'
|
|
||||||
|
|
||||||
def _parse(self):
|
|
||||||
if self._parsed:
|
|
||||||
return
|
|
||||||
super(DoxyGroup, self)._parse()
|
|
||||||
self.retrieve_data()
|
|
||||||
if self._error:
|
|
||||||
return
|
|
||||||
cdef = self._retrieved_data.compounddef
|
|
||||||
self._data['title'] = description(cdef.title)
|
|
||||||
# Process inner groups
|
|
||||||
grps = cdef.innergroup
|
|
||||||
for grp in grps:
|
|
||||||
converted = DoxyGroup.from_refid(grp.refid, top=self.top)
|
|
||||||
self._members.append(converted)
|
|
||||||
# Process inner classes
|
|
||||||
klasses = cdef.innerclass
|
|
||||||
for kls in klasses:
|
|
||||||
converted = DoxyClass.from_refid(kls.refid, top=self.top)
|
|
||||||
self._members.append(converted)
|
|
||||||
# Process normal members
|
|
||||||
self.process_memberdefs()
|
|
||||||
|
|
||||||
title = property(lambda self: self.data()['title'])
|
|
||||||
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyGroup)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyFriend(DoxyMember):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kind = 'friend'
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyFriend)
|
|
||||||
|
|
||||||
|
|
||||||
class DoxyOther(Base):
|
|
||||||
|
|
||||||
__module__ = "gnuradio.utils.doxyxml"
|
|
||||||
|
|
||||||
kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum', 'dir', 'page'])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def can_parse(cls, obj):
|
|
||||||
return obj.kind in cls.kinds
|
|
||||||
|
|
||||||
Base.mem_classes.append(DoxyOther)
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,50 +0,0 @@
|
|||||||
/* -*- c++ -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* This file is part of GNU Radio
|
|
||||||
*
|
|
||||||
* GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
#include <iostream>
|
|
||||||
#include "aadvark.h"
|
|
||||||
|
|
||||||
void Aadvark::print() {
|
|
||||||
std::cout << "aadvark is " << aadvarkness << "/10 aadvarky" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
Aadvark::Aadvark(int aaness): aadvarkness(aaness) {}
|
|
||||||
|
|
||||||
bool aadvarky_enough(Aadvark aad) {
|
|
||||||
if (aad.get_aadvarkness() > 6)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Aadvark::get_aadvarkness() {
|
|
||||||
return aadvarkness;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
Aadvark arold = Aadvark(6);
|
|
||||||
arold.print();
|
|
||||||
if (aadvarky_enough(arold))
|
|
||||||
std::cout << "He is aadvarky enough" << std::endl;
|
|
||||||
else
|
|
||||||
std::cout << "He is not aadvarky enough" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/* -*- c++ -*- */
|
|
||||||
/*
|
|
||||||
* Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* This file is part of GNU Radio
|
|
||||||
*
|
|
||||||
* GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Models the mammal Aadvark.
|
|
||||||
*
|
|
||||||
* Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
|
|
||||||
*
|
|
||||||
* This line is uninformative and is only to test line breaks in the comments.
|
|
||||||
*/
|
|
||||||
class Aadvark {
|
|
||||||
public:
|
|
||||||
//! \brief Outputs the vital aadvark statistics.
|
|
||||||
void print();
|
|
||||||
//! \param aaness The aadvarkness of an aadvark is a measure of how aadvarky it is.
|
|
||||||
Aadvark(int aaness);
|
|
||||||
int get_aadvarkness();
|
|
||||||
private:
|
|
||||||
int aadvarkness;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool aadvarky_enough(Aadvark aad);
|
|
||||||
|
|
||||||
int main();
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
|
||||||
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.6.3">
|
|
||||||
<compounddef id="aadvark_8cc" kind="file">
|
|
||||||
<compoundname>aadvark.cc</compoundname>
|
|
||||||
<includes local="no">iostream</includes>
|
|
||||||
<includes refid="aadvark_8cc" local="yes">aadvark.h</includes>
|
|
||||||
<includedby refid="aadvark_8cc" local="yes">aadvark.cc</includedby>
|
|
||||||
<incdepgraph>
|
|
||||||
<node id="0">
|
|
||||||
<label>aadvark.cc</label>
|
|
||||||
<link refid="aadvark.cc"/>
|
|
||||||
<childnode refid="1" relation="include">
|
|
||||||
</childnode>
|
|
||||||
</node>
|
|
||||||
<node id="1">
|
|
||||||
<label>iostream</label>
|
|
||||||
</node>
|
|
||||||
</incdepgraph>
|
|
||||||
<sectiondef kind="func">
|
|
||||||
<memberdef kind="function" id="aadvark_8cc_1acb52858524210ec6dddc3e16d1e52946" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>bool</type>
|
|
||||||
<definition>bool aadvarky_enough</definition>
|
|
||||||
<argsstring>(Aadvark aad)</argsstring>
|
|
||||||
<name>aadvarky_enough</name>
|
|
||||||
<param>
|
|
||||||
<type><ref refid="classAadvark" kindref="compound">Aadvark</ref></type>
|
|
||||||
<declname>aad</declname>
|
|
||||||
</param>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" line="10" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="10" bodyend="15"/>
|
|
||||||
</memberdef>
|
|
||||||
<memberdef kind="function" id="aadvark_8cc_1ae66f6b31b5ad750f1fe042a706a4e3d4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>int</type>
|
|
||||||
<definition>int main</definition>
|
|
||||||
<argsstring>()</argsstring>
|
|
||||||
<name>main</name>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" line="21" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="21" bodyend="28"/>
|
|
||||||
</memberdef>
|
|
||||||
</sectiondef>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<programlisting>
|
|
||||||
<codeline lineno="1"><highlight class="preprocessor">#include<sp/><iostream></highlight><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>"aadvark.h"</highlight><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="3"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="4"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classAadvark_1abd061aa5f998002e72080a34f512a059" kindref="member" tooltip="Outputs the vital aadvark statistics.">Aadvark::print</ref>()<sp/>{</highlight></codeline>
|
|
||||||
<codeline lineno="5"><highlight class="normal"><sp/><sp/>std::cout<sp/><<<sp/></highlight><highlight class="stringliteral">"aadvark<sp/>is<sp/>"</highlight><highlight class="normal"><sp/><<<sp/>aadvarkness<sp/><<<sp/></highlight><highlight class="stringliteral">"/10<sp/>aadvarky"</highlight><highlight class="normal"><sp/><<<sp/>std::endl;</highlight></codeline>
|
|
||||||
<codeline lineno="6"><highlight class="normal">}</highlight></codeline>
|
|
||||||
<codeline lineno="7"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="8"><highlight class="normal"><ref refid="classAadvark_1adf1a4b97a641411a74a04ab312484462" kindref="member">Aadvark::Aadvark</ref>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>aaness):<sp/>aadvarkness(aaness)<sp/>{}</highlight></codeline>
|
|
||||||
<codeline lineno="9"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="10"><highlight class="normal"></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>aadvarky_enough(<ref refid="classAadvark" kindref="compound" tooltip="Models the mammal Aadvark.">Aadvark</ref><sp/>aad)<sp/>{</highlight></codeline>
|
|
||||||
<codeline lineno="11"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(aad.get_aadvarkness()<sp/>><sp/>6)</highlight></codeline>
|
|
||||||
<codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
|
|
||||||
<codeline lineno="13"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordflow">else</highlight><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
|
|
||||||
<codeline lineno="15"><highlight class="normal">}</highlight></codeline>
|
|
||||||
<codeline lineno="16"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="17"><highlight class="normal"></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>Aadvark::get_aadvarkness()<sp/>{</highlight></codeline>
|
|
||||||
<codeline lineno="18"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>aadvarkness;</highlight></codeline>
|
|
||||||
<codeline lineno="19"><highlight class="normal">}</highlight></codeline>
|
|
||||||
<codeline lineno="20"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="21"><highlight class="normal"></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>main()<sp/>{</highlight></codeline>
|
|
||||||
<codeline lineno="22"><highlight class="normal"><sp/><sp/><ref refid="classAadvark" kindref="compound" tooltip="Models the mammal Aadvark.">Aadvark</ref><sp/>arold<sp/>=<sp/><ref refid="classAadvark" kindref="compound" tooltip="Models the mammal Aadvark.">Aadvark</ref>(6);</highlight></codeline>
|
|
||||||
<codeline lineno="23"><highlight class="normal"><sp/><sp/>arold.<ref refid="classAadvark_1abd061aa5f998002e72080a34f512a059" kindref="member" tooltip="Outputs the vital aadvark statistics.">print</ref>();</highlight></codeline>
|
|
||||||
<codeline lineno="24"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(aadvarky_enough(arold))</highlight></codeline>
|
|
||||||
<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/>std::cout<sp/><<<sp/></highlight><highlight class="stringliteral">"He<sp/>is<sp/>aadvarky<sp/>enough"</highlight><highlight class="normal"><sp/><<<sp/>std::endl;</highlight></codeline>
|
|
||||||
<codeline lineno="26"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordflow">else</highlight><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/>std::cout<sp/><<<sp/></highlight><highlight class="stringliteral">"He<sp/>is<sp/>not<sp/>aadvarky<sp/>enough"</highlight><highlight class="normal"><sp/><<<sp/>std::endl;</highlight></codeline>
|
|
||||||
<codeline lineno="28"><highlight class="normal">}</highlight></codeline>
|
|
||||||
<codeline lineno="29"><highlight class="normal"></highlight></codeline>
|
|
||||||
</programlisting>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc"/>
|
|
||||||
</compounddef>
|
|
||||||
</doxygen>
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
|
||||||
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.6.3">
|
|
||||||
<compounddef id="aadvark_8h" kind="file">
|
|
||||||
<compoundname>aadvark.h</compoundname>
|
|
||||||
<includes local="no">iostream</includes>
|
|
||||||
<incdepgraph>
|
|
||||||
<node id="3">
|
|
||||||
<label>aadvark.h</label>
|
|
||||||
<link refid="aadvark.h"/>
|
|
||||||
<childnode refid="4" relation="include">
|
|
||||||
</childnode>
|
|
||||||
</node>
|
|
||||||
<node id="4">
|
|
||||||
<label>iostream</label>
|
|
||||||
</node>
|
|
||||||
</incdepgraph>
|
|
||||||
<innerclass refid="classAadvark" prot="public">Aadvark</innerclass>
|
|
||||||
<sectiondef kind="func">
|
|
||||||
<memberdef kind="function" id="aadvark_8h_1acb52858524210ec6dddc3e16d1e52946" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>bool</type>
|
|
||||||
<definition>bool aadvarky_enough</definition>
|
|
||||||
<argsstring>(Aadvark aad)</argsstring>
|
|
||||||
<name>aadvarky_enough</name>
|
|
||||||
<param>
|
|
||||||
<type><ref refid="classAadvark" kindref="compound">Aadvark</ref></type>
|
|
||||||
<declname>aad</declname>
|
|
||||||
</param>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="21" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="10" bodyend="15"/>
|
|
||||||
</memberdef>
|
|
||||||
<memberdef kind="function" id="aadvark_8h_1ae66f6b31b5ad750f1fe042a706a4e3d4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>int</type>
|
|
||||||
<definition>int main</definition>
|
|
||||||
<argsstring>()</argsstring>
|
|
||||||
<name>main</name>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="23" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="21" bodyend="28"/>
|
|
||||||
</memberdef>
|
|
||||||
</sectiondef>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<programlisting>
|
|
||||||
<codeline lineno="1"><highlight class="preprocessor">#include<sp/><iostream></highlight><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="2"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="10" refid="classAadvark" refkind="compound"><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="classAadvark" kindref="compound" tooltip="Models the mammal Aadvark.">Aadvark</ref><sp/>{</highlight></codeline>
|
|
||||||
<codeline lineno="11"><highlight class="normal"></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
|
|
||||||
<codeline lineno="13"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classAadvark_1abd061aa5f998002e72080a34f512a059" kindref="member" tooltip="Outputs the vital aadvark statistics.">print</ref>();</highlight></codeline>
|
|
||||||
<codeline lineno="15"><highlight class="normal"><sp/><sp/><ref refid="classAadvark_1adf1a4b97a641411a74a04ab312484462" kindref="member">Aadvark</ref>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>aaness);</highlight></codeline>
|
|
||||||
<codeline lineno="16"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>get_aadvarkness();</highlight></codeline>
|
|
||||||
<codeline lineno="17"><highlight class="normal"></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
|
|
||||||
<codeline lineno="18"><highlight class="normal"><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>aadvarkness;</highlight></codeline>
|
|
||||||
<codeline lineno="19"><highlight class="normal">};</highlight></codeline>
|
|
||||||
<codeline lineno="20"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="21"><highlight class="normal"></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>aadvarky_enough(<ref refid="classAadvark" kindref="compound" tooltip="Models the mammal Aadvark.">Aadvark</ref><sp/>aad);</highlight></codeline>
|
|
||||||
<codeline lineno="22"><highlight class="normal"></highlight></codeline>
|
|
||||||
<codeline lineno="23"><highlight class="normal"></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>main();</highlight></codeline>
|
|
||||||
</programlisting>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h"/>
|
|
||||||
</compounddef>
|
|
||||||
</doxygen>
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
|
||||||
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.6.3">
|
|
||||||
<compounddef id="classAadvark" kind="class" prot="public">
|
|
||||||
<compoundname>Aadvark</compoundname>
|
|
||||||
<includes refid="aadvark_8h" local="no">aadvark.h</includes>
|
|
||||||
<sectiondef kind="private-attrib">
|
|
||||||
<memberdef kind="variable" id="classAadvark_1ab79eb58d7bb9d5ddfa5d6f783836cab9" prot="private" static="no" mutable="no">
|
|
||||||
<type>int</type>
|
|
||||||
<definition>int Aadvark::aadvarkness</definition>
|
|
||||||
<argsstring></argsstring>
|
|
||||||
<name>aadvarkness</name>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="18" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" bodystart="18" bodyend="-1"/>
|
|
||||||
</memberdef>
|
|
||||||
</sectiondef>
|
|
||||||
<sectiondef kind="public-func">
|
|
||||||
<memberdef kind="function" id="classAadvark_1abd061aa5f998002e72080a34f512a059" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>void</type>
|
|
||||||
<definition>void Aadvark::print</definition>
|
|
||||||
<argsstring>()</argsstring>
|
|
||||||
<name>print</name>
|
|
||||||
<briefdescription>
|
|
||||||
<para>Outputs the vital aadvark statistics. </para> </briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="13" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="4" bodyend="6"/>
|
|
||||||
</memberdef>
|
|
||||||
<memberdef kind="function" id="classAadvark_1adf1a4b97a641411a74a04ab312484462" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type></type>
|
|
||||||
<definition>Aadvark::Aadvark</definition>
|
|
||||||
<argsstring>(int aaness)</argsstring>
|
|
||||||
<name>Aadvark</name>
|
|
||||||
<param>
|
|
||||||
<type>int</type>
|
|
||||||
<declname>aaness</declname>
|
|
||||||
</param>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
<para><parameterlist kind="param"><parameteritem>
|
|
||||||
<parameternamelist>
|
|
||||||
<parametername>aaness</parametername>
|
|
||||||
</parameternamelist>
|
|
||||||
<parameterdescription>
|
|
||||||
<para>The aadvarkness of an aadvark is a measure of how aadvarky it is. </para></parameterdescription>
|
|
||||||
</parameteritem>
|
|
||||||
</parameterlist>
|
|
||||||
</para> </detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="15" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="8" bodyend="8"/>
|
|
||||||
</memberdef>
|
|
||||||
<memberdef kind="function" id="classAadvark_1affd2ada0a85807efcbe26615a848f53e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
|
|
||||||
<type>int</type>
|
|
||||||
<definition>int Aadvark::get_aadvarkness</definition>
|
|
||||||
<argsstring>()</argsstring>
|
|
||||||
<name>get_aadvarkness</name>
|
|
||||||
<briefdescription>
|
|
||||||
</briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
</detaileddescription>
|
|
||||||
<inbodydescription>
|
|
||||||
</inbodydescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="16" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.cc" bodystart="17" bodyend="19"/>
|
|
||||||
</memberdef>
|
|
||||||
</sectiondef>
|
|
||||||
<briefdescription>
|
|
||||||
<para>Models the mammal <ref refid="classAadvark" kindref="compound">Aadvark</ref>. </para> </briefdescription>
|
|
||||||
<detaileddescription>
|
|
||||||
<para>Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.</para><para>This line is uninformative and is only to test line breaks in the comments. </para> </detaileddescription>
|
|
||||||
<location file="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" line="10" bodyfile="/home/ben/gnuradio/gnuradio-core/src/python/gnuradio/utils/doxyxml/example/aadvark.h" bodystart="10" bodyend="19"/>
|
|
||||||
<listofallmembers>
|
|
||||||
<member refid="classAadvark_1adf1a4b97a641411a74a04ab312484462" prot="public" virt="non-virtual"><scope>Aadvark</scope><name>Aadvark</name></member>
|
|
||||||
<member refid="classAadvark_1ab79eb58d7bb9d5ddfa5d6f783836cab9" prot="private" virt="non-virtual"><scope>Aadvark</scope><name>aadvarkness</name></member>
|
|
||||||
<member refid="classAadvark_1affd2ada0a85807efcbe26615a848f53e" prot="public" virt="non-virtual"><scope>Aadvark</scope><name>get_aadvarkness</name></member>
|
|
||||||
<member refid="classAadvark_1abd061aa5f998002e72080a34f512a059" prot="public" virt="non-virtual"><scope>Aadvark</scope><name>print</name></member>
|
|
||||||
</listofallmembers>
|
|
||||||
</compounddef>
|
|
||||||
</doxygen>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<!-- XSLT script to combine the generated output into a single file.
|
|
||||||
If you have xsltproc you could use:
|
|
||||||
xsltproc combine.xslt index.xml >all.xml
|
|
||||||
-->
|
|
||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
|
||||||
<xsl:output method="xml" version="1.0" indent="yes" standalone="yes" />
|
|
||||||
<xsl:template match="/">
|
|
||||||
<doxygen version="{doxygenindex/@version}">
|
|
||||||
<!-- Load all doxgen generated xml files -->
|
|
||||||
<xsl:for-each select="doxygenindex/compound">
|
|
||||||
<xsl:copy-of select="document( concat( @refid, '.xml' ) )/doxygen/*" />
|
|
||||||
</xsl:for-each>
|
|
||||||
</doxygen>
|
|
||||||
</xsl:template>
|
|
||||||
</xsl:stylesheet>
|
|
||||||
@@ -1,814 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='utf-8' ?>
|
|
||||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<xsd:element name="doxygen" type="DoxygenType"/>
|
|
||||||
|
|
||||||
<!-- Complex types -->
|
|
||||||
|
|
||||||
<xsd:complexType name="DoxygenType">
|
|
||||||
<xsd:sequence maxOccurs="unbounded">
|
|
||||||
<xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="version" type="DoxVersionNumber" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="compounddefType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="compoundname" type="xsd:string"/>
|
|
||||||
<xsd:element name="title" type="xsd:string" minOccurs="0" />
|
|
||||||
<xsd:element name="basecompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="derivedcompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="includes" type="incType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="includedby" type="incType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="incdepgraph" type="graphType" minOccurs="0" />
|
|
||||||
<xsd:element name="invincdepgraph" type="graphType" minOccurs="0" />
|
|
||||||
<xsd:element name="innerdir" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="innerfile" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="innerclass" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="innernamespace" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="innerpage" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
|
|
||||||
<xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="inheritancegraph" type="graphType" minOccurs="0" />
|
|
||||||
<xsd:element name="collaborationgraph" type="graphType" minOccurs="0" />
|
|
||||||
<xsd:element name="programlisting" type="listingType" minOccurs="0" />
|
|
||||||
<xsd:element name="location" type="locationType" minOccurs="0" />
|
|
||||||
<xsd:element name="listofallmembers" type="listofallmembersType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
<xsd:attribute name="kind" type="DoxCompoundKind" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="listofallmembersType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="member" type="memberRefType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="memberRefType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="scope" />
|
|
||||||
<xsd:element name="name" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" />
|
|
||||||
<xsd:attribute name="virt" type="DoxVirtualKind" />
|
|
||||||
<xsd:attribute name="ambiguityscope" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="compoundRefType" mixed="true">
|
|
||||||
<xsd:simpleContent>
|
|
||||||
<xsd:extension base="xsd:string">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" use="optional" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" />
|
|
||||||
<xsd:attribute name="virt" type="DoxVirtualKind" />
|
|
||||||
</xsd:extension>
|
|
||||||
</xsd:simpleContent>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="reimplementType" mixed="true">
|
|
||||||
<xsd:simpleContent>
|
|
||||||
<xsd:extension base="xsd:string">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
</xsd:extension>
|
|
||||||
</xsd:simpleContent>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="incType" mixed="true">
|
|
||||||
<xsd:simpleContent>
|
|
||||||
<xsd:extension base="xsd:string">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="local" type="DoxBool" />
|
|
||||||
</xsd:extension>
|
|
||||||
</xsd:simpleContent>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="refType" mixed="true">
|
|
||||||
<xsd:simpleContent>
|
|
||||||
<xsd:extension base="xsd:string">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
|
|
||||||
</xsd:extension>
|
|
||||||
</xsd:simpleContent>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="refTextType" mixed="true">
|
|
||||||
<xsd:simpleContent>
|
|
||||||
<xsd:extension base="xsd:string">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="kindref" type="DoxRefKind" />
|
|
||||||
<xsd:attribute name="external" type="xsd:string" use="optional"/>
|
|
||||||
<xsd:attribute name="tooltip" type="xsd:string" use="optional"/>
|
|
||||||
</xsd:extension>
|
|
||||||
</xsd:simpleContent>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="sectiondefType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="header" type="xsd:string" minOccurs="0" />
|
|
||||||
<xsd:element name="description" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="memberdef" type="memberdefType" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="kind" type="DoxSectionKind" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="memberdefType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
|
|
||||||
<xsd:element name="type" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="definition" minOccurs="0" />
|
|
||||||
<xsd:element name="argsstring" minOccurs="0" />
|
|
||||||
<xsd:element name="name" />
|
|
||||||
<xsd:element name="read" minOccurs="0" />
|
|
||||||
<xsd:element name="write" minOccurs="0" />
|
|
||||||
<xsd:element name="bitfield" minOccurs="0" />
|
|
||||||
<xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="enumvalue" type="enumvalueType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="exceptions" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="inbodydescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="location" type="locationType" />
|
|
||||||
<xsd:element name="references" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="referencedby" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="kind" type="DoxMemberKind" />
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" />
|
|
||||||
<xsd:attribute name="static" type="DoxBool" />
|
|
||||||
<xsd:attribute name="const" type="DoxBool" />
|
|
||||||
<xsd:attribute name="explicit" type="DoxBool" />
|
|
||||||
<xsd:attribute name="inline" type="DoxBool" />
|
|
||||||
<xsd:attribute name="virt" type="DoxVirtualKind" />
|
|
||||||
<xsd:attribute name="volatile" type="DoxBool" />
|
|
||||||
<xsd:attribute name="mutable" type="DoxBool" />
|
|
||||||
<!-- Qt property -->
|
|
||||||
<xsd:attribute name="readable" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="writable" type="DoxBool" use="optional"/>
|
|
||||||
<!-- C++/CLI variable -->
|
|
||||||
<xsd:attribute name="initonly" type="DoxBool" use="optional"/>
|
|
||||||
<!-- C++/CLI and C# property -->
|
|
||||||
<xsd:attribute name="settable" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="gettable" type="DoxBool" use="optional"/>
|
|
||||||
<!-- C++/CLI function -->
|
|
||||||
<xsd:attribute name="final" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="sealed" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="new" type="DoxBool" use="optional"/>
|
|
||||||
<!-- C++/CLI event -->
|
|
||||||
<xsd:attribute name="add" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="remove" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="raise" type="DoxBool" use="optional"/>
|
|
||||||
<!-- Objective-C 2.0 protocol method -->
|
|
||||||
<xsd:attribute name="optional" type="DoxBool" use="optional"/>
|
|
||||||
<xsd:attribute name="required" type="DoxBool" use="optional"/>
|
|
||||||
<!-- Objective-C 2.0 property accessor -->
|
|
||||||
<xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="descriptionType" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="xsd:string" minOccurs="0"/>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="enumvalueType" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="name" />
|
|
||||||
<xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
|
|
||||||
<xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
<xsd:attribute name="prot" type="DoxProtectionKind" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="templateparamlistType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="paramType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="type" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="declname" minOccurs="0" />
|
|
||||||
<xsd:element name="defname" minOccurs="0" />
|
|
||||||
<xsd:element name="array" minOccurs="0" />
|
|
||||||
<xsd:element name="defval" type="linkedTextType" minOccurs="0" />
|
|
||||||
<xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="linkedTextType" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="graphType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="node" type="nodeType" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="nodeType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="label" />
|
|
||||||
<xsd:element name="link" type="linkType" minOccurs="0" />
|
|
||||||
<xsd:element name="childnode" type="childnodeType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="childnodeType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="edgelabel" minOccurs="0" maxOccurs="unbounded"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="relation" type="DoxGraphRelation" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="linkType">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="external" type="xsd:string" use="optional"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="listingType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="codelineType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="highlight" type="highlightType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="lineno" type="xsd:integer" />
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="refkind" type="DoxRefKind" />
|
|
||||||
<xsd:attribute name="external" type="DoxBool" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="highlightType" mixed="true">
|
|
||||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
|
||||||
<xsd:element name="sp" />
|
|
||||||
<xsd:element name="ref" type="refTextType" />
|
|
||||||
</xsd:choice>
|
|
||||||
<xsd:attribute name="class" type="DoxHighlightClass" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="referenceType" mixed="true">
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="compoundref" type="xsd:string" use="optional" />
|
|
||||||
<xsd:attribute name="startline" type="xsd:integer" />
|
|
||||||
<xsd:attribute name="endline" type="xsd:integer" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="locationType">
|
|
||||||
<xsd:attribute name="file" type="xsd:string" />
|
|
||||||
<xsd:attribute name="line" type="xsd:integer" />
|
|
||||||
<xsd:attribute name="bodyfile" type="xsd:string" />
|
|
||||||
<xsd:attribute name="bodystart" type="xsd:integer" />
|
|
||||||
<xsd:attribute name="bodyend" type="xsd:integer" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docSect1Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="xsd:string" />
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalS1Type" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docSect2Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="xsd:string" />
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalS2Type" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docSect3Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="xsd:string" />
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect4" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalS3Type" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docSect4Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="xsd:string" />
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalS4Type" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docInternalType" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docInternalS1Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docInternalS2Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docInternalS3Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect3" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docInternalS4Type" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:group name="docTitleCmdGroup">
|
|
||||||
<xsd:choice>
|
|
||||||
<xsd:element name="ulink" type="docURLLink" />
|
|
||||||
<xsd:element name="bold" type="docMarkupType" />
|
|
||||||
<xsd:element name="emphasis" type="docMarkupType" />
|
|
||||||
<xsd:element name="computeroutput" type="docMarkupType" />
|
|
||||||
<xsd:element name="subscript" type="docMarkupType" />
|
|
||||||
<xsd:element name="superscript" type="docMarkupType" />
|
|
||||||
<xsd:element name="center" type="docMarkupType" />
|
|
||||||
<xsd:element name="small" type="docMarkupType" />
|
|
||||||
<xsd:element name="htmlonly" type="xsd:string" />
|
|
||||||
<xsd:element name="latexonly" type="xsd:string" />
|
|
||||||
<xsd:element name="dot" type="xsd:string" />
|
|
||||||
<xsd:element name="anchor" type="docAnchorType" />
|
|
||||||
<xsd:element name="formula" type="docFormulaType" />
|
|
||||||
<xsd:element name="ref" type="docRefTextType" />
|
|
||||||
<xsd:element name="copy" type="docEmptyType" />
|
|
||||||
<xsd:element name="trademark" type="docEmptyType" />
|
|
||||||
<xsd:element name="registered" type="docEmptyType" />
|
|
||||||
<xsd:element name="lsquo" type="docEmptyType" />
|
|
||||||
<xsd:element name="rsquo" type="docEmptyType" />
|
|
||||||
<xsd:element name="ldquo" type="docEmptyType" />
|
|
||||||
<xsd:element name="rdquo" type="docEmptyType" />
|
|
||||||
<xsd:element name="ndash" type="docEmptyType" />
|
|
||||||
<xsd:element name="mdash" type="docEmptyType" />
|
|
||||||
<xsd:element name="umlaut" type="docCharType" />
|
|
||||||
<xsd:element name="acute" type="docCharType" />
|
|
||||||
<xsd:element name="grave" type="docCharType" />
|
|
||||||
<xsd:element name="circ" type="docCharType" />
|
|
||||||
<xsd:element name="slash" type="docCharType" />
|
|
||||||
<xsd:element name="tilde" type="docCharType" />
|
|
||||||
<xsd:element name="cedil" type="docCharType" />
|
|
||||||
<xsd:element name="ring" type="docCharType" />
|
|
||||||
<xsd:element name="szlig" type="docEmptyType" />
|
|
||||||
<xsd:element name="nonbreakablespace" type="docEmptyType" />
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:group>
|
|
||||||
|
|
||||||
<xsd:complexType name="docTitleType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:group name="docCmdGroup">
|
|
||||||
<xsd:choice>
|
|
||||||
<xsd:group ref="docTitleCmdGroup"/>
|
|
||||||
<xsd:element name="linebreak" type="docEmptyType" />
|
|
||||||
<xsd:element name="hruler" type="docEmptyType" />
|
|
||||||
<xsd:element name="preformatted" type="docMarkupType" />
|
|
||||||
<xsd:element name="programlisting" type="listingType" />
|
|
||||||
<xsd:element name="verbatim" type="xsd:string" />
|
|
||||||
<xsd:element name="indexentry" type="docIndexEntryType" />
|
|
||||||
<xsd:element name="orderedlist" type="docListType" />
|
|
||||||
<xsd:element name="itemizedlist" type="docListType" />
|
|
||||||
<xsd:element name="simplesect" type="docSimpleSectType" />
|
|
||||||
<xsd:element name="title" type="docTitleType" />
|
|
||||||
<xsd:element name="variablelist" type="docVariableListType" />
|
|
||||||
<xsd:element name="table" type="docTableType" />
|
|
||||||
<xsd:element name="heading" type="docHeadingType" />
|
|
||||||
<xsd:element name="image" type="docImageType" />
|
|
||||||
<xsd:element name="dotfile" type="docDotFileType" />
|
|
||||||
<xsd:element name="toclist" type="docTocListType" />
|
|
||||||
<xsd:element name="language" type="docLanguageType" />
|
|
||||||
<xsd:element name="parameterlist" type="docParamListType" />
|
|
||||||
<xsd:element name="xrefsect" type="docXRefSectType" />
|
|
||||||
<xsd:element name="copydoc" type="docCopyType" />
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:group>
|
|
||||||
|
|
||||||
<xsd:complexType name="docParaType" mixed="true">
|
|
||||||
<xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docMarkupType" mixed="true">
|
|
||||||
<xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docURLLink" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="url" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docAnchorType" mixed="true">
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docFormulaType" mixed="true">
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docIndexEntryType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="primaryie" type="xsd:string" />
|
|
||||||
<xsd:element name="secondaryie" type="xsd:string" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docListType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="listitem" type="docListItemType" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docListItemType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docSimpleSectType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="title" type="docTitleType" minOccurs="0" />
|
|
||||||
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="simplesectsep" type="docEmptyType" minOccurs="0"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="kind" type="DoxSimpleSectKind" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docVarListEntryType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="term" type="docTitleType" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:group name="docVariableListGroup">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="varlistentry" type="docVarListEntryType" />
|
|
||||||
<xsd:element name="listitem" type="docListItemType" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:group>
|
|
||||||
|
|
||||||
<xsd:complexType name="docVariableListType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:group ref="docVariableListGroup" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docRefTextType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" />
|
|
||||||
<xsd:attribute name="kindref" type="DoxRefKind" />
|
|
||||||
<xsd:attribute name="external" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docTableType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="row" type="docRowType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="caption" type="docCaptionType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="rows" type="xsd:integer" />
|
|
||||||
<xsd:attribute name="cols" type="xsd:integer" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docRowType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="entry" type="docEntryType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docEntryType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="thead" type="DoxBool" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docCaptionType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docHeadingType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="level" type="xsd:integer" /> <!-- todo: range 1-6 -->
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docImageType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="type" type="DoxImageKind" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
<xsd:attribute name="width" type="xsd:string" />
|
|
||||||
<xsd:attribute name="height" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docDotFileType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docTocItemType" mixed="true">
|
|
||||||
<xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docTocListType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="tocitem" type="docTocItemType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docLanguageType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="langid" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docParamListType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="kind" type="DoxParamListKind" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docParamListItem">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="parameterdescription" type="descriptionType" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docParamNameList">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docParamName" mixed="true">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="direction" type="DoxParamDir" use="optional" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docXRefSectType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="xrefdescription" type="descriptionType" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="id" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docCopyType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
|
|
||||||
<xsd:element name="internal" type="docInternalType" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="link" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docCharType">
|
|
||||||
<xsd:attribute name="char" type="DoxCharRange"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="docEmptyType"/>
|
|
||||||
|
|
||||||
<!-- Simple types -->
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxBool">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="yes" />
|
|
||||||
<xsd:enumeration value="no" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxGraphRelation">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="include" />
|
|
||||||
<xsd:enumeration value="usage" />
|
|
||||||
<xsd:enumeration value="template-instance" />
|
|
||||||
<xsd:enumeration value="public-inheritance" />
|
|
||||||
<xsd:enumeration value="protected-inheritance" />
|
|
||||||
<xsd:enumeration value="private-inheritance" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxRefKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="compound" />
|
|
||||||
<xsd:enumeration value="member" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxMemberKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="define" />
|
|
||||||
<xsd:enumeration value="property" />
|
|
||||||
<xsd:enumeration value="event" />
|
|
||||||
<xsd:enumeration value="variable" />
|
|
||||||
<xsd:enumeration value="typedef" />
|
|
||||||
<xsd:enumeration value="enum" />
|
|
||||||
<xsd:enumeration value="function" />
|
|
||||||
<xsd:enumeration value="signal" />
|
|
||||||
<xsd:enumeration value="prototype" />
|
|
||||||
<xsd:enumeration value="friend" />
|
|
||||||
<xsd:enumeration value="dcop" />
|
|
||||||
<xsd:enumeration value="slot" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxProtectionKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="public" />
|
|
||||||
<xsd:enumeration value="protected" />
|
|
||||||
<xsd:enumeration value="private" />
|
|
||||||
<xsd:enumeration value="package" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxVirtualKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="non-virtual" />
|
|
||||||
<xsd:enumeration value="virtual" />
|
|
||||||
<xsd:enumeration value="pure-virtual" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxCompoundKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="class" />
|
|
||||||
<xsd:enumeration value="struct" />
|
|
||||||
<xsd:enumeration value="union" />
|
|
||||||
<xsd:enumeration value="interface" />
|
|
||||||
<xsd:enumeration value="protocol" />
|
|
||||||
<xsd:enumeration value="category" />
|
|
||||||
<xsd:enumeration value="exception" />
|
|
||||||
<xsd:enumeration value="file" />
|
|
||||||
<xsd:enumeration value="namespace" />
|
|
||||||
<xsd:enumeration value="group" />
|
|
||||||
<xsd:enumeration value="page" />
|
|
||||||
<xsd:enumeration value="example" />
|
|
||||||
<xsd:enumeration value="dir" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxSectionKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="user-defined" />
|
|
||||||
<xsd:enumeration value="public-type" />
|
|
||||||
<xsd:enumeration value="public-func" />
|
|
||||||
<xsd:enumeration value="public-attrib" />
|
|
||||||
<xsd:enumeration value="public-slot" />
|
|
||||||
<xsd:enumeration value="signal" />
|
|
||||||
<xsd:enumeration value="dcop-func" />
|
|
||||||
<xsd:enumeration value="property" />
|
|
||||||
<xsd:enumeration value="event" />
|
|
||||||
<xsd:enumeration value="public-static-func" />
|
|
||||||
<xsd:enumeration value="public-static-attrib" />
|
|
||||||
<xsd:enumeration value="protected-type" />
|
|
||||||
<xsd:enumeration value="protected-func" />
|
|
||||||
<xsd:enumeration value="protected-attrib" />
|
|
||||||
<xsd:enumeration value="protected-slot" />
|
|
||||||
<xsd:enumeration value="protected-static-func" />
|
|
||||||
<xsd:enumeration value="protected-static-attrib" />
|
|
||||||
<xsd:enumeration value="package-type" />
|
|
||||||
<xsd:enumeration value="package-func" />
|
|
||||||
<xsd:enumeration value="package-attrib" />
|
|
||||||
<xsd:enumeration value="package-static-func" />
|
|
||||||
<xsd:enumeration value="package-static-attrib" />
|
|
||||||
<xsd:enumeration value="private-type" />
|
|
||||||
<xsd:enumeration value="private-func" />
|
|
||||||
<xsd:enumeration value="private-attrib" />
|
|
||||||
<xsd:enumeration value="private-slot" />
|
|
||||||
<xsd:enumeration value="private-static-func" />
|
|
||||||
<xsd:enumeration value="private-static-attrib" />
|
|
||||||
<xsd:enumeration value="friend" />
|
|
||||||
<xsd:enumeration value="related" />
|
|
||||||
<xsd:enumeration value="define" />
|
|
||||||
<xsd:enumeration value="prototype" />
|
|
||||||
<xsd:enumeration value="typedef" />
|
|
||||||
<xsd:enumeration value="enum" />
|
|
||||||
<xsd:enumeration value="func" />
|
|
||||||
<xsd:enumeration value="var" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxHighlightClass">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="comment" />
|
|
||||||
<xsd:enumeration value="normal" />
|
|
||||||
<xsd:enumeration value="preprocessor" />
|
|
||||||
<xsd:enumeration value="keyword" />
|
|
||||||
<xsd:enumeration value="keywordtype" />
|
|
||||||
<xsd:enumeration value="keywordflow" />
|
|
||||||
<xsd:enumeration value="stringliteral" />
|
|
||||||
<xsd:enumeration value="charliteral" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxSimpleSectKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="see" />
|
|
||||||
<xsd:enumeration value="return" />
|
|
||||||
<xsd:enumeration value="author" />
|
|
||||||
<xsd:enumeration value="authors" />
|
|
||||||
<xsd:enumeration value="version" />
|
|
||||||
<xsd:enumeration value="since" />
|
|
||||||
<xsd:enumeration value="date" />
|
|
||||||
<xsd:enumeration value="note" />
|
|
||||||
<xsd:enumeration value="warning" />
|
|
||||||
<xsd:enumeration value="pre" />
|
|
||||||
<xsd:enumeration value="post" />
|
|
||||||
<xsd:enumeration value="invariant" />
|
|
||||||
<xsd:enumeration value="remark" />
|
|
||||||
<xsd:enumeration value="attention" />
|
|
||||||
<xsd:enumeration value="par" />
|
|
||||||
<xsd:enumeration value="rcs" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxVersionNumber">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:pattern value="\d+\.\d+.*" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxImageKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="html" />
|
|
||||||
<xsd:enumeration value="latex" />
|
|
||||||
<xsd:enumeration value="rtf" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxParamListKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="param" />
|
|
||||||
<xsd:enumeration value="retval" />
|
|
||||||
<xsd:enumeration value="exception" />
|
|
||||||
<xsd:enumeration value="templateparam" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxCharRange">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:pattern value="[aeiouncAEIOUNC]" />
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxParamDir">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="in"/>
|
|
||||||
<xsd:enumeration value="out"/>
|
|
||||||
<xsd:enumeration value="inout"/>
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="DoxAccessor">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="retain"/>
|
|
||||||
<xsd:enumeration value="copy"/>
|
|
||||||
<xsd:enumeration value="assign"/>
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
</xsd:schema>
|
|
||||||
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
|
||||||
<doxygenindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd" version="1.6.3">
|
|
||||||
<compound refid="classAadvark" kind="class"><name>Aadvark</name>
|
|
||||||
<member refid="classAadvark_1ab79eb58d7bb9d5ddfa5d6f783836cab9" kind="variable"><name>aadvarkness</name></member>
|
|
||||||
<member refid="classAadvark_1abd061aa5f998002e72080a34f512a059" kind="function"><name>print</name></member>
|
|
||||||
<member refid="classAadvark_1adf1a4b97a641411a74a04ab312484462" kind="function"><name>Aadvark</name></member>
|
|
||||||
<member refid="classAadvark_1affd2ada0a85807efcbe26615a848f53e" kind="function"><name>get_aadvarkness</name></member>
|
|
||||||
</compound>
|
|
||||||
<compound refid="aadvark_8cc" kind="file"><name>aadvark.cc</name>
|
|
||||||
<member refid="aadvark_8cc_1acb52858524210ec6dddc3e16d1e52946" kind="function"><name>aadvarky_enough</name></member>
|
|
||||||
<member refid="aadvark_8cc_1ae66f6b31b5ad750f1fe042a706a4e3d4" kind="function"><name>main</name></member>
|
|
||||||
</compound>
|
|
||||||
<compound refid="aadvark_8h" kind="file"><name>aadvark.h</name>
|
|
||||||
<member refid="aadvark_8h_1acb52858524210ec6dddc3e16d1e52946" kind="function"><name>aadvarky_enough</name></member>
|
|
||||||
<member refid="aadvark_8h_1ae66f6b31b5ad750f1fe042a706a4e3d4" kind="function"><name>main</name></member>
|
|
||||||
</compound>
|
|
||||||
</doxygenindex>
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='utf-8' ?>
|
|
||||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<xsd:element name="doxygenindex" type="DoxygenType"/>
|
|
||||||
|
|
||||||
<xsd:complexType name="DoxygenType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="version" type="xsd:string" use="required"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="CompoundType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="name" type="xsd:string"/>
|
|
||||||
<xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" use="required"/>
|
|
||||||
<xsd:attribute name="kind" type="CompoundKind" use="required"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:complexType name="MemberType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="name" type="xsd:string"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="refid" type="xsd:string" use="required"/>
|
|
||||||
<xsd:attribute name="kind" type="MemberKind" use="required"/>
|
|
||||||
</xsd:complexType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="CompoundKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="class"/>
|
|
||||||
<xsd:enumeration value="struct"/>
|
|
||||||
<xsd:enumeration value="union"/>
|
|
||||||
<xsd:enumeration value="interface"/>
|
|
||||||
<xsd:enumeration value="protocol"/>
|
|
||||||
<xsd:enumeration value="category"/>
|
|
||||||
<xsd:enumeration value="exception"/>
|
|
||||||
<xsd:enumeration value="file"/>
|
|
||||||
<xsd:enumeration value="namespace"/>
|
|
||||||
<xsd:enumeration value="group"/>
|
|
||||||
<xsd:enumeration value="page"/>
|
|
||||||
<xsd:enumeration value="example"/>
|
|
||||||
<xsd:enumeration value="dir"/>
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
<xsd:simpleType name="MemberKind">
|
|
||||||
<xsd:restriction base="xsd:string">
|
|
||||||
<xsd:enumeration value="define"/>
|
|
||||||
<xsd:enumeration value="property"/>
|
|
||||||
<xsd:enumeration value="event"/>
|
|
||||||
<xsd:enumeration value="variable"/>
|
|
||||||
<xsd:enumeration value="typedef"/>
|
|
||||||
<xsd:enumeration value="enum"/>
|
|
||||||
<xsd:enumeration value="enumvalue"/>
|
|
||||||
<xsd:enumeration value="function"/>
|
|
||||||
<xsd:enumeration value="signal"/>
|
|
||||||
<xsd:enumeration value="prototype"/>
|
|
||||||
<xsd:enumeration value="friend"/>
|
|
||||||
<xsd:enumeration value="dcop"/>
|
|
||||||
<xsd:enumeration value="slot"/>
|
|
||||||
</xsd:restriction>
|
|
||||||
</xsd:simpleType>
|
|
||||||
|
|
||||||
</xsd:schema>
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
"""
|
|
||||||
Contains generated files produced by generateDS.py.
|
|
||||||
|
|
||||||
These do the real work of parsing the doxygen xml files but the
|
|
||||||
resultant classes are not very friendly to navigate so the rest of the
|
|
||||||
doxyxml module processes them further.
|
|
||||||
"""
|
|
||||||
@@ -1,503 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""
|
|
||||||
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from string import lower as str_lower
|
|
||||||
from xml.dom import minidom
|
|
||||||
from xml.dom import Node
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import compoundsuper as supermod
|
|
||||||
from compoundsuper import MixedContainer
|
|
||||||
|
|
||||||
|
|
||||||
class DoxygenTypeSub(supermod.DoxygenType):
|
|
||||||
def __init__(self, version=None, compounddef=None):
|
|
||||||
supermod.DoxygenType.__init__(self, version, compounddef)
|
|
||||||
|
|
||||||
def find(self, details):
|
|
||||||
|
|
||||||
return self.compounddef.find(details)
|
|
||||||
|
|
||||||
supermod.DoxygenType.subclass = DoxygenTypeSub
|
|
||||||
# end class DoxygenTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class compounddefTypeSub(supermod.compounddefType):
|
|
||||||
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):
|
|
||||||
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)
|
|
||||||
|
|
||||||
def find(self, details):
|
|
||||||
|
|
||||||
if self.id == details.refid:
|
|
||||||
return self
|
|
||||||
|
|
||||||
for sectiondef in self.sectiondef:
|
|
||||||
result = sectiondef.find(details)
|
|
||||||
if result:
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
supermod.compounddefType.subclass = compounddefTypeSub
|
|
||||||
# end class compounddefTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class listofallmembersTypeSub(supermod.listofallmembersType):
|
|
||||||
def __init__(self, member=None):
|
|
||||||
supermod.listofallmembersType.__init__(self, member)
|
|
||||||
supermod.listofallmembersType.subclass = listofallmembersTypeSub
|
|
||||||
# end class listofallmembersTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class memberRefTypeSub(supermod.memberRefType):
|
|
||||||
def __init__(self, virt=None, prot=None, refid=None, ambiguityscope=None, scope='', name=''):
|
|
||||||
supermod.memberRefType.__init__(self, virt, prot, refid, ambiguityscope, scope, name)
|
|
||||||
supermod.memberRefType.subclass = memberRefTypeSub
|
|
||||||
# end class memberRefTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class compoundRefTypeSub(supermod.compoundRefType):
|
|
||||||
def __init__(self, virt=None, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.compoundRefType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.compoundRefType.subclass = compoundRefTypeSub
|
|
||||||
# end class compoundRefTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class reimplementTypeSub(supermod.reimplementType):
|
|
||||||
def __init__(self, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.reimplementType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.reimplementType.subclass = reimplementTypeSub
|
|
||||||
# end class reimplementTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class incTypeSub(supermod.incType):
|
|
||||||
def __init__(self, local=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.incType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.incType.subclass = incTypeSub
|
|
||||||
# end class incTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class refTypeSub(supermod.refType):
|
|
||||||
def __init__(self, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.refType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.refType.subclass = refTypeSub
|
|
||||||
# end class refTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class refTextTypeSub(supermod.refTextType):
|
|
||||||
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.refTextType.__init__(self, mixedclass_, content_)
|
|
||||||
|
|
||||||
supermod.refTextType.subclass = refTextTypeSub
|
|
||||||
# end class refTextTypeSub
|
|
||||||
|
|
||||||
class sectiondefTypeSub(supermod.sectiondefType):
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, kind=None, header='', description=None, memberdef=None):
|
|
||||||
supermod.sectiondefType.__init__(self, kind, header, description, memberdef)
|
|
||||||
|
|
||||||
def find(self, details):
|
|
||||||
|
|
||||||
for memberdef in self.memberdef:
|
|
||||||
if memberdef.id == details.refid:
|
|
||||||
return memberdef
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
supermod.sectiondefType.subclass = sectiondefTypeSub
|
|
||||||
# end class sectiondefTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class memberdefTypeSub(supermod.memberdefType):
|
|
||||||
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):
|
|
||||||
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)
|
|
||||||
supermod.memberdefType.subclass = memberdefTypeSub
|
|
||||||
# end class memberdefTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class descriptionTypeSub(supermod.descriptionType):
|
|
||||||
def __init__(self, title='', para=None, sect1=None, internal=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.descriptionType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.descriptionType.subclass = descriptionTypeSub
|
|
||||||
# end class descriptionTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class enumvalueTypeSub(supermod.enumvalueType):
|
|
||||||
def __init__(self, prot=None, id=None, name='', initializer=None, briefdescription=None, detaileddescription=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.enumvalueType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.enumvalueType.subclass = enumvalueTypeSub
|
|
||||||
# end class enumvalueTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class templateparamlistTypeSub(supermod.templateparamlistType):
|
|
||||||
def __init__(self, param=None):
|
|
||||||
supermod.templateparamlistType.__init__(self, param)
|
|
||||||
supermod.templateparamlistType.subclass = templateparamlistTypeSub
|
|
||||||
# end class templateparamlistTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class paramTypeSub(supermod.paramType):
|
|
||||||
def __init__(self, type_=None, declname='', defname='', array='', defval=None, briefdescription=None):
|
|
||||||
supermod.paramType.__init__(self, type_, declname, defname, array, defval, briefdescription)
|
|
||||||
supermod.paramType.subclass = paramTypeSub
|
|
||||||
# end class paramTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class linkedTextTypeSub(supermod.linkedTextType):
|
|
||||||
def __init__(self, ref=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.linkedTextType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.linkedTextType.subclass = linkedTextTypeSub
|
|
||||||
# end class linkedTextTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class graphTypeSub(supermod.graphType):
|
|
||||||
def __init__(self, node=None):
|
|
||||||
supermod.graphType.__init__(self, node)
|
|
||||||
supermod.graphType.subclass = graphTypeSub
|
|
||||||
# end class graphTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class nodeTypeSub(supermod.nodeType):
|
|
||||||
def __init__(self, id=None, label='', link=None, childnode=None):
|
|
||||||
supermod.nodeType.__init__(self, id, label, link, childnode)
|
|
||||||
supermod.nodeType.subclass = nodeTypeSub
|
|
||||||
# end class nodeTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class childnodeTypeSub(supermod.childnodeType):
|
|
||||||
def __init__(self, relation=None, refid=None, edgelabel=None):
|
|
||||||
supermod.childnodeType.__init__(self, relation, refid, edgelabel)
|
|
||||||
supermod.childnodeType.subclass = childnodeTypeSub
|
|
||||||
# end class childnodeTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class linkTypeSub(supermod.linkType):
|
|
||||||
def __init__(self, refid=None, external=None, valueOf_=''):
|
|
||||||
supermod.linkType.__init__(self, refid, external)
|
|
||||||
supermod.linkType.subclass = linkTypeSub
|
|
||||||
# end class linkTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class listingTypeSub(supermod.listingType):
|
|
||||||
def __init__(self, codeline=None):
|
|
||||||
supermod.listingType.__init__(self, codeline)
|
|
||||||
supermod.listingType.subclass = listingTypeSub
|
|
||||||
# end class listingTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class codelineTypeSub(supermod.codelineType):
|
|
||||||
def __init__(self, external=None, lineno=None, refkind=None, refid=None, highlight=None):
|
|
||||||
supermod.codelineType.__init__(self, external, lineno, refkind, refid, highlight)
|
|
||||||
supermod.codelineType.subclass = codelineTypeSub
|
|
||||||
# end class codelineTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class highlightTypeSub(supermod.highlightType):
|
|
||||||
def __init__(self, class_=None, sp=None, ref=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.highlightType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.highlightType.subclass = highlightTypeSub
|
|
||||||
# end class highlightTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class referenceTypeSub(supermod.referenceType):
|
|
||||||
def __init__(self, endline=None, startline=None, refid=None, compoundref=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.referenceType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.referenceType.subclass = referenceTypeSub
|
|
||||||
# end class referenceTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class locationTypeSub(supermod.locationType):
|
|
||||||
def __init__(self, bodystart=None, line=None, bodyend=None, bodyfile=None, file=None, valueOf_=''):
|
|
||||||
supermod.locationType.__init__(self, bodystart, line, bodyend, bodyfile, file)
|
|
||||||
supermod.locationType.subclass = locationTypeSub
|
|
||||||
# end class locationTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docSect1TypeSub(supermod.docSect1Type):
|
|
||||||
def __init__(self, id=None, title='', para=None, sect2=None, internal=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docSect1Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docSect1Type.subclass = docSect1TypeSub
|
|
||||||
# end class docSect1TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docSect2TypeSub(supermod.docSect2Type):
|
|
||||||
def __init__(self, id=None, title='', para=None, sect3=None, internal=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docSect2Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docSect2Type.subclass = docSect2TypeSub
|
|
||||||
# end class docSect2TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docSect3TypeSub(supermod.docSect3Type):
|
|
||||||
def __init__(self, id=None, title='', para=None, sect4=None, internal=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docSect3Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docSect3Type.subclass = docSect3TypeSub
|
|
||||||
# end class docSect3TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docSect4TypeSub(supermod.docSect4Type):
|
|
||||||
def __init__(self, id=None, title='', para=None, internal=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docSect4Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docSect4Type.subclass = docSect4TypeSub
|
|
||||||
# end class docSect4TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docInternalTypeSub(supermod.docInternalType):
|
|
||||||
def __init__(self, para=None, sect1=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docInternalType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docInternalType.subclass = docInternalTypeSub
|
|
||||||
# end class docInternalTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docInternalS1TypeSub(supermod.docInternalS1Type):
|
|
||||||
def __init__(self, para=None, sect2=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docInternalS1Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docInternalS1Type.subclass = docInternalS1TypeSub
|
|
||||||
# end class docInternalS1TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docInternalS2TypeSub(supermod.docInternalS2Type):
|
|
||||||
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docInternalS2Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docInternalS2Type.subclass = docInternalS2TypeSub
|
|
||||||
# end class docInternalS2TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docInternalS3TypeSub(supermod.docInternalS3Type):
|
|
||||||
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docInternalS3Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docInternalS3Type.subclass = docInternalS3TypeSub
|
|
||||||
# end class docInternalS3TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docInternalS4TypeSub(supermod.docInternalS4Type):
|
|
||||||
def __init__(self, para=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docInternalS4Type.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docInternalS4Type.subclass = docInternalS4TypeSub
|
|
||||||
# end class docInternalS4TypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docURLLinkSub(supermod.docURLLink):
|
|
||||||
def __init__(self, url=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docURLLink.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docURLLink.subclass = docURLLinkSub
|
|
||||||
# end class docURLLinkSub
|
|
||||||
|
|
||||||
|
|
||||||
class docAnchorTypeSub(supermod.docAnchorType):
|
|
||||||
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docAnchorType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docAnchorType.subclass = docAnchorTypeSub
|
|
||||||
# end class docAnchorTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docFormulaTypeSub(supermod.docFormulaType):
|
|
||||||
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docFormulaType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docFormulaType.subclass = docFormulaTypeSub
|
|
||||||
# end class docFormulaTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docIndexEntryTypeSub(supermod.docIndexEntryType):
|
|
||||||
def __init__(self, primaryie='', secondaryie=''):
|
|
||||||
supermod.docIndexEntryType.__init__(self, primaryie, secondaryie)
|
|
||||||
supermod.docIndexEntryType.subclass = docIndexEntryTypeSub
|
|
||||||
# end class docIndexEntryTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docListTypeSub(supermod.docListType):
|
|
||||||
def __init__(self, listitem=None):
|
|
||||||
supermod.docListType.__init__(self, listitem)
|
|
||||||
supermod.docListType.subclass = docListTypeSub
|
|
||||||
# end class docListTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docListItemTypeSub(supermod.docListItemType):
|
|
||||||
def __init__(self, para=None):
|
|
||||||
supermod.docListItemType.__init__(self, para)
|
|
||||||
supermod.docListItemType.subclass = docListItemTypeSub
|
|
||||||
# end class docListItemTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docSimpleSectTypeSub(supermod.docSimpleSectType):
|
|
||||||
def __init__(self, kind=None, title=None, para=None):
|
|
||||||
supermod.docSimpleSectType.__init__(self, kind, title, para)
|
|
||||||
supermod.docSimpleSectType.subclass = docSimpleSectTypeSub
|
|
||||||
# end class docSimpleSectTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docVarListEntryTypeSub(supermod.docVarListEntryType):
|
|
||||||
def __init__(self, term=None):
|
|
||||||
supermod.docVarListEntryType.__init__(self, term)
|
|
||||||
supermod.docVarListEntryType.subclass = docVarListEntryTypeSub
|
|
||||||
# end class docVarListEntryTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docRefTextTypeSub(supermod.docRefTextType):
|
|
||||||
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docRefTextType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docRefTextType.subclass = docRefTextTypeSub
|
|
||||||
# end class docRefTextTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docTableTypeSub(supermod.docTableType):
|
|
||||||
def __init__(self, rows=None, cols=None, row=None, caption=None):
|
|
||||||
supermod.docTableType.__init__(self, rows, cols, row, caption)
|
|
||||||
supermod.docTableType.subclass = docTableTypeSub
|
|
||||||
# end class docTableTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docRowTypeSub(supermod.docRowType):
|
|
||||||
def __init__(self, entry=None):
|
|
||||||
supermod.docRowType.__init__(self, entry)
|
|
||||||
supermod.docRowType.subclass = docRowTypeSub
|
|
||||||
# end class docRowTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docEntryTypeSub(supermod.docEntryType):
|
|
||||||
def __init__(self, thead=None, para=None):
|
|
||||||
supermod.docEntryType.__init__(self, thead, para)
|
|
||||||
supermod.docEntryType.subclass = docEntryTypeSub
|
|
||||||
# end class docEntryTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docHeadingTypeSub(supermod.docHeadingType):
|
|
||||||
def __init__(self, level=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docHeadingType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docHeadingType.subclass = docHeadingTypeSub
|
|
||||||
# end class docHeadingTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docImageTypeSub(supermod.docImageType):
|
|
||||||
def __init__(self, width=None, type_=None, name=None, height=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docImageType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docImageType.subclass = docImageTypeSub
|
|
||||||
# end class docImageTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docDotFileTypeSub(supermod.docDotFileType):
|
|
||||||
def __init__(self, name=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docDotFileType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docDotFileType.subclass = docDotFileTypeSub
|
|
||||||
# end class docDotFileTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docTocItemTypeSub(supermod.docTocItemType):
|
|
||||||
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
|
||||||
supermod.docTocItemType.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docTocItemType.subclass = docTocItemTypeSub
|
|
||||||
# end class docTocItemTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docTocListTypeSub(supermod.docTocListType):
|
|
||||||
def __init__(self, tocitem=None):
|
|
||||||
supermod.docTocListType.__init__(self, tocitem)
|
|
||||||
supermod.docTocListType.subclass = docTocListTypeSub
|
|
||||||
# end class docTocListTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docLanguageTypeSub(supermod.docLanguageType):
|
|
||||||
def __init__(self, langid=None, para=None):
|
|
||||||
supermod.docLanguageType.__init__(self, langid, para)
|
|
||||||
supermod.docLanguageType.subclass = docLanguageTypeSub
|
|
||||||
# end class docLanguageTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docParamListTypeSub(supermod.docParamListType):
|
|
||||||
def __init__(self, kind=None, parameteritem=None):
|
|
||||||
supermod.docParamListType.__init__(self, kind, parameteritem)
|
|
||||||
supermod.docParamListType.subclass = docParamListTypeSub
|
|
||||||
# end class docParamListTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docParamListItemSub(supermod.docParamListItem):
|
|
||||||
def __init__(self, parameternamelist=None, parameterdescription=None):
|
|
||||||
supermod.docParamListItem.__init__(self, parameternamelist, parameterdescription)
|
|
||||||
supermod.docParamListItem.subclass = docParamListItemSub
|
|
||||||
# end class docParamListItemSub
|
|
||||||
|
|
||||||
|
|
||||||
class docParamNameListSub(supermod.docParamNameList):
|
|
||||||
def __init__(self, parametername=None):
|
|
||||||
supermod.docParamNameList.__init__(self, parametername)
|
|
||||||
supermod.docParamNameList.subclass = docParamNameListSub
|
|
||||||
# end class docParamNameListSub
|
|
||||||
|
|
||||||
|
|
||||||
class docParamNameSub(supermod.docParamName):
|
|
||||||
def __init__(self, direction=None, ref=None, mixedclass_=None, content_=None):
|
|
||||||
supermod.docParamName.__init__(self, mixedclass_, content_)
|
|
||||||
supermod.docParamName.subclass = docParamNameSub
|
|
||||||
# end class docParamNameSub
|
|
||||||
|
|
||||||
|
|
||||||
class docXRefSectTypeSub(supermod.docXRefSectType):
|
|
||||||
def __init__(self, id=None, xreftitle=None, xrefdescription=None):
|
|
||||||
supermod.docXRefSectType.__init__(self, id, xreftitle, xrefdescription)
|
|
||||||
supermod.docXRefSectType.subclass = docXRefSectTypeSub
|
|
||||||
# end class docXRefSectTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docCopyTypeSub(supermod.docCopyType):
|
|
||||||
def __init__(self, link=None, para=None, sect1=None, internal=None):
|
|
||||||
supermod.docCopyType.__init__(self, link, para, sect1, internal)
|
|
||||||
supermod.docCopyType.subclass = docCopyTypeSub
|
|
||||||
# end class docCopyTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class docCharTypeSub(supermod.docCharType):
|
|
||||||
def __init__(self, char=None, valueOf_=''):
|
|
||||||
supermod.docCharType.__init__(self, char)
|
|
||||||
supermod.docCharType.subclass = docCharTypeSub
|
|
||||||
# end class docCharTypeSub
|
|
||||||
|
|
||||||
class docParaTypeSub(supermod.docParaType):
|
|
||||||
def __init__(self, char=None, valueOf_=''):
|
|
||||||
supermod.docParaType.__init__(self, char)
|
|
||||||
|
|
||||||
self.parameterlist = []
|
|
||||||
self.simplesects = []
|
|
||||||
self.content = []
|
|
||||||
|
|
||||||
def buildChildren(self, child_, nodeName_):
|
|
||||||
supermod.docParaType.buildChildren(self, child_, nodeName_)
|
|
||||||
|
|
||||||
if child_.nodeType == Node.TEXT_NODE:
|
|
||||||
obj_ = self.mixedclass_(MixedContainer.CategoryText,
|
|
||||||
MixedContainer.TypeNone, '', child_.nodeValue)
|
|
||||||
self.content.append(obj_)
|
|
||||||
elif child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == "ref":
|
|
||||||
obj_ = supermod.docRefTextType.factory()
|
|
||||||
obj_.build(child_)
|
|
||||||
self.content.append(obj_)
|
|
||||||
elif child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'parameterlist':
|
|
||||||
obj_ = supermod.docParamListType.factory()
|
|
||||||
obj_.build(child_)
|
|
||||||
self.parameterlist.append(obj_)
|
|
||||||
elif child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'simplesect':
|
|
||||||
obj_ = supermod.docSimpleSectType.factory()
|
|
||||||
obj_.build(child_)
|
|
||||||
self.simplesects.append(obj_)
|
|
||||||
|
|
||||||
|
|
||||||
supermod.docParaType.subclass = docParaTypeSub
|
|
||||||
# end class docParaTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def parse(inFilename):
|
|
||||||
doc = minidom.parse(inFilename)
|
|
||||||
rootNode = doc.documentElement
|
|
||||||
rootObj = supermod.DoxygenType.factory()
|
|
||||||
rootObj.build(rootNode)
|
|
||||||
return rootObj
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,77 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
"""
|
|
||||||
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from xml.dom import minidom
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import compound
|
|
||||||
|
|
||||||
import indexsuper as supermod
|
|
||||||
|
|
||||||
class DoxygenTypeSub(supermod.DoxygenType):
|
|
||||||
def __init__(self, version=None, compound=None):
|
|
||||||
supermod.DoxygenType.__init__(self, version, compound)
|
|
||||||
|
|
||||||
def find_compounds_and_members(self, details):
|
|
||||||
"""
|
|
||||||
Returns a list of all compounds and their members which match details
|
|
||||||
"""
|
|
||||||
|
|
||||||
results = []
|
|
||||||
for compound in self.compound:
|
|
||||||
members = compound.find_members(details)
|
|
||||||
if members:
|
|
||||||
results.append([compound, members])
|
|
||||||
else:
|
|
||||||
if details.match(compound):
|
|
||||||
results.append([compound, []])
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
supermod.DoxygenType.subclass = DoxygenTypeSub
|
|
||||||
# end class DoxygenTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class CompoundTypeSub(supermod.CompoundType):
|
|
||||||
def __init__(self, kind=None, refid=None, name='', member=None):
|
|
||||||
supermod.CompoundType.__init__(self, kind, refid, name, member)
|
|
||||||
|
|
||||||
def find_members(self, details):
|
|
||||||
"""
|
|
||||||
Returns a list of all members which match details
|
|
||||||
"""
|
|
||||||
|
|
||||||
results = []
|
|
||||||
|
|
||||||
for member in self.member:
|
|
||||||
if details.match(member):
|
|
||||||
results.append(member)
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
supermod.CompoundType.subclass = CompoundTypeSub
|
|
||||||
# end class CompoundTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
class MemberTypeSub(supermod.MemberType):
|
|
||||||
|
|
||||||
def __init__(self, kind=None, refid=None, name=''):
|
|
||||||
supermod.MemberType.__init__(self, kind, refid, name)
|
|
||||||
|
|
||||||
supermod.MemberType.subclass = MemberTypeSub
|
|
||||||
# end class MemberTypeSub
|
|
||||||
|
|
||||||
|
|
||||||
def parse(inFilename):
|
|
||||||
|
|
||||||
doc = minidom.parse(inFilename)
|
|
||||||
rootNode = doc.documentElement
|
|
||||||
rootObj = supermod.DoxygenType.factory()
|
|
||||||
rootObj.build(rootNode)
|
|
||||||
|
|
||||||
return rootObj
|
|
||||||
|
|
||||||
@@ -1,523 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
|
|
||||||
#
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import getopt
|
|
||||||
from string import lower as str_lower
|
|
||||||
from xml.dom import minidom
|
|
||||||
from xml.dom import Node
|
|
||||||
|
|
||||||
#
|
|
||||||
# User methods
|
|
||||||
#
|
|
||||||
# Calls to the methods in these classes are generated by generateDS.py.
|
|
||||||
# You can replace these methods by re-implementing the following class
|
|
||||||
# in a module named generatedssuper.py.
|
|
||||||
|
|
||||||
try:
|
|
||||||
from generatedssuper import GeneratedsSuper
|
|
||||||
except ImportError, exp:
|
|
||||||
|
|
||||||
class GeneratedsSuper:
|
|
||||||
def format_string(self, input_data, input_name=''):
|
|
||||||
return input_data
|
|
||||||
def format_integer(self, input_data, input_name=''):
|
|
||||||
return '%d' % input_data
|
|
||||||
def format_float(self, input_data, input_name=''):
|
|
||||||
return '%f' % input_data
|
|
||||||
def format_double(self, input_data, input_name=''):
|
|
||||||
return '%e' % input_data
|
|
||||||
def format_boolean(self, input_data, input_name=''):
|
|
||||||
return '%s' % input_data
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# If you have installed IPython you can uncomment and use the following.
|
|
||||||
# IPython is available from http://ipython.scipy.org/.
|
|
||||||
#
|
|
||||||
|
|
||||||
## from IPython.Shell import IPShellEmbed
|
|
||||||
## args = ''
|
|
||||||
## ipshell = IPShellEmbed(args,
|
|
||||||
## banner = 'Dropping into IPython',
|
|
||||||
## exit_msg = 'Leaving Interpreter, back to program.')
|
|
||||||
|
|
||||||
# Then use the following line where and when you want to drop into the
|
|
||||||
# IPython shell:
|
|
||||||
# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
|
|
||||||
|
|
||||||
#
|
|
||||||
# Globals
|
|
||||||
#
|
|
||||||
|
|
||||||
ExternalEncoding = 'ascii'
|
|
||||||
|
|
||||||
#
|
|
||||||
# Support/utility functions.
|
|
||||||
#
|
|
||||||
|
|
||||||
def showIndent(outfile, level):
|
|
||||||
for idx in range(level):
|
|
||||||
outfile.write(' ')
|
|
||||||
|
|
||||||
def quote_xml(inStr):
|
|
||||||
s1 = (isinstance(inStr, basestring) and inStr or
|
|
||||||
'%s' % inStr)
|
|
||||||
s1 = s1.replace('&', '&')
|
|
||||||
s1 = s1.replace('<', '<')
|
|
||||||
s1 = s1.replace('>', '>')
|
|
||||||
return s1
|
|
||||||
|
|
||||||
def quote_attrib(inStr):
|
|
||||||
s1 = (isinstance(inStr, basestring) and inStr or
|
|
||||||
'%s' % inStr)
|
|
||||||
s1 = s1.replace('&', '&')
|
|
||||||
s1 = s1.replace('<', '<')
|
|
||||||
s1 = s1.replace('>', '>')
|
|
||||||
if '"' in s1:
|
|
||||||
if "'" in s1:
|
|
||||||
s1 = '"%s"' % s1.replace('"', """)
|
|
||||||
else:
|
|
||||||
s1 = "'%s'" % s1
|
|
||||||
else:
|
|
||||||
s1 = '"%s"' % s1
|
|
||||||
return s1
|
|
||||||
|
|
||||||
def quote_python(inStr):
|
|
||||||
s1 = inStr
|
|
||||||
if s1.find("'") == -1:
|
|
||||||
if s1.find('\n') == -1:
|
|
||||||
return "'%s'" % s1
|
|
||||||
else:
|
|
||||||
return "'''%s'''" % s1
|
|
||||||
else:
|
|
||||||
if s1.find('"') != -1:
|
|
||||||
s1 = s1.replace('"', '\\"')
|
|
||||||
if s1.find('\n') == -1:
|
|
||||||
return '"%s"' % s1
|
|
||||||
else:
|
|
||||||
return '"""%s"""' % s1
|
|
||||||
|
|
||||||
|
|
||||||
class MixedContainer:
|
|
||||||
# Constants for category:
|
|
||||||
CategoryNone = 0
|
|
||||||
CategoryText = 1
|
|
||||||
CategorySimple = 2
|
|
||||||
CategoryComplex = 3
|
|
||||||
# Constants for content_type:
|
|
||||||
TypeNone = 0
|
|
||||||
TypeText = 1
|
|
||||||
TypeString = 2
|
|
||||||
TypeInteger = 3
|
|
||||||
TypeFloat = 4
|
|
||||||
TypeDecimal = 5
|
|
||||||
TypeDouble = 6
|
|
||||||
TypeBoolean = 7
|
|
||||||
def __init__(self, category, content_type, name, value):
|
|
||||||
self.category = category
|
|
||||||
self.content_type = content_type
|
|
||||||
self.name = name
|
|
||||||
self.value = value
|
|
||||||
def getCategory(self):
|
|
||||||
return self.category
|
|
||||||
def getContenttype(self, content_type):
|
|
||||||
return self.content_type
|
|
||||||
def getValue(self):
|
|
||||||
return self.value
|
|
||||||
def getName(self):
|
|
||||||
return self.name
|
|
||||||
def export(self, outfile, level, name, namespace):
|
|
||||||
if self.category == MixedContainer.CategoryText:
|
|
||||||
outfile.write(self.value)
|
|
||||||
elif self.category == MixedContainer.CategorySimple:
|
|
||||||
self.exportSimple(outfile, level, name)
|
|
||||||
else: # category == MixedContainer.CategoryComplex
|
|
||||||
self.value.export(outfile, level, namespace,name)
|
|
||||||
def exportSimple(self, outfile, level, name):
|
|
||||||
if self.content_type == MixedContainer.TypeString:
|
|
||||||
outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name))
|
|
||||||
elif self.content_type == MixedContainer.TypeInteger or \
|
|
||||||
self.content_type == MixedContainer.TypeBoolean:
|
|
||||||
outfile.write('<%s>%d</%s>' % (self.name, self.value, self.name))
|
|
||||||
elif self.content_type == MixedContainer.TypeFloat or \
|
|
||||||
self.content_type == MixedContainer.TypeDecimal:
|
|
||||||
outfile.write('<%s>%f</%s>' % (self.name, self.value, self.name))
|
|
||||||
elif self.content_type == MixedContainer.TypeDouble:
|
|
||||||
outfile.write('<%s>%g</%s>' % (self.name, self.value, self.name))
|
|
||||||
def exportLiteral(self, outfile, level, name):
|
|
||||||
if self.category == MixedContainer.CategoryText:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
|
||||||
(self.category, self.content_type, self.name, self.value))
|
|
||||||
elif self.category == MixedContainer.CategorySimple:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
|
||||||
(self.category, self.content_type, self.name, self.value))
|
|
||||||
else: # category == MixedContainer.CategoryComplex
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('MixedContainer(%d, %d, "%s",\n' % \
|
|
||||||
(self.category, self.content_type, self.name,))
|
|
||||||
self.value.exportLiteral(outfile, level + 1)
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write(')\n')
|
|
||||||
|
|
||||||
|
|
||||||
class _MemberSpec(object):
|
|
||||||
def __init__(self, name='', data_type='', container=0):
|
|
||||||
self.name = name
|
|
||||||
self.data_type = data_type
|
|
||||||
self.container = container
|
|
||||||
def set_name(self, name): self.name = name
|
|
||||||
def get_name(self): return self.name
|
|
||||||
def set_data_type(self, data_type): self.data_type = data_type
|
|
||||||
def get_data_type(self): return self.data_type
|
|
||||||
def set_container(self, container): self.container = container
|
|
||||||
def get_container(self): return self.container
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Data representation classes.
|
|
||||||
#
|
|
||||||
|
|
||||||
class DoxygenType(GeneratedsSuper):
|
|
||||||
subclass = None
|
|
||||||
superclass = None
|
|
||||||
def __init__(self, version=None, compound=None):
|
|
||||||
self.version = version
|
|
||||||
if compound is None:
|
|
||||||
self.compound = []
|
|
||||||
else:
|
|
||||||
self.compound = compound
|
|
||||||
def factory(*args_, **kwargs_):
|
|
||||||
if DoxygenType.subclass:
|
|
||||||
return DoxygenType.subclass(*args_, **kwargs_)
|
|
||||||
else:
|
|
||||||
return DoxygenType(*args_, **kwargs_)
|
|
||||||
factory = staticmethod(factory)
|
|
||||||
def get_compound(self): return self.compound
|
|
||||||
def set_compound(self, compound): self.compound = compound
|
|
||||||
def add_compound(self, value): self.compound.append(value)
|
|
||||||
def insert_compound(self, index, value): self.compound[index] = value
|
|
||||||
def get_version(self): return self.version
|
|
||||||
def set_version(self, version): self.version = version
|
|
||||||
def export(self, outfile, level, namespace_='', name_='DoxygenType', namespacedef_=''):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
|
||||||
self.exportAttributes(outfile, level, namespace_, name_='DoxygenType')
|
|
||||||
if self.hasContent_():
|
|
||||||
outfile.write('>\n')
|
|
||||||
self.exportChildren(outfile, level + 1, namespace_, name_)
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('</%s%s>\n' % (namespace_, name_))
|
|
||||||
else:
|
|
||||||
outfile.write(' />\n')
|
|
||||||
def exportAttributes(self, outfile, level, namespace_='', name_='DoxygenType'):
|
|
||||||
outfile.write(' version=%s' % (self.format_string(quote_attrib(self.version).encode(ExternalEncoding), input_name='version'), ))
|
|
||||||
def exportChildren(self, outfile, level, namespace_='', name_='DoxygenType'):
|
|
||||||
for compound_ in self.compound:
|
|
||||||
compound_.export(outfile, level, namespace_, name_='compound')
|
|
||||||
def hasContent_(self):
|
|
||||||
if (
|
|
||||||
self.compound is not None
|
|
||||||
):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
def exportLiteral(self, outfile, level, name_='DoxygenType'):
|
|
||||||
level += 1
|
|
||||||
self.exportLiteralAttributes(outfile, level, name_)
|
|
||||||
if self.hasContent_():
|
|
||||||
self.exportLiteralChildren(outfile, level, name_)
|
|
||||||
def exportLiteralAttributes(self, outfile, level, name_):
|
|
||||||
if self.version is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('version = %s,\n' % (self.version,))
|
|
||||||
def exportLiteralChildren(self, outfile, level, name_):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('compound=[\n')
|
|
||||||
level += 1
|
|
||||||
for compound in self.compound:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('model_.compound(\n')
|
|
||||||
compound.exportLiteral(outfile, level, name_='compound')
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('),\n')
|
|
||||||
level -= 1
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('],\n')
|
|
||||||
def build(self, node_):
|
|
||||||
attrs = node_.attributes
|
|
||||||
self.buildAttributes(attrs)
|
|
||||||
for child_ in node_.childNodes:
|
|
||||||
nodeName_ = child_.nodeName.split(':')[-1]
|
|
||||||
self.buildChildren(child_, nodeName_)
|
|
||||||
def buildAttributes(self, attrs):
|
|
||||||
if attrs.get('version'):
|
|
||||||
self.version = attrs.get('version').value
|
|
||||||
def buildChildren(self, child_, nodeName_):
|
|
||||||
if child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'compound':
|
|
||||||
obj_ = CompoundType.factory()
|
|
||||||
obj_.build(child_)
|
|
||||||
self.compound.append(obj_)
|
|
||||||
# end class DoxygenType
|
|
||||||
|
|
||||||
|
|
||||||
class CompoundType(GeneratedsSuper):
|
|
||||||
subclass = None
|
|
||||||
superclass = None
|
|
||||||
def __init__(self, kind=None, refid=None, name=None, member=None):
|
|
||||||
self.kind = kind
|
|
||||||
self.refid = refid
|
|
||||||
self.name = name
|
|
||||||
if member is None:
|
|
||||||
self.member = []
|
|
||||||
else:
|
|
||||||
self.member = member
|
|
||||||
def factory(*args_, **kwargs_):
|
|
||||||
if CompoundType.subclass:
|
|
||||||
return CompoundType.subclass(*args_, **kwargs_)
|
|
||||||
else:
|
|
||||||
return CompoundType(*args_, **kwargs_)
|
|
||||||
factory = staticmethod(factory)
|
|
||||||
def get_name(self): return self.name
|
|
||||||
def set_name(self, name): self.name = name
|
|
||||||
def get_member(self): return self.member
|
|
||||||
def set_member(self, member): self.member = member
|
|
||||||
def add_member(self, value): self.member.append(value)
|
|
||||||
def insert_member(self, index, value): self.member[index] = value
|
|
||||||
def get_kind(self): return self.kind
|
|
||||||
def set_kind(self, kind): self.kind = kind
|
|
||||||
def get_refid(self): return self.refid
|
|
||||||
def set_refid(self, refid): self.refid = refid
|
|
||||||
def export(self, outfile, level, namespace_='', name_='CompoundType', namespacedef_=''):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
|
||||||
self.exportAttributes(outfile, level, namespace_, name_='CompoundType')
|
|
||||||
if self.hasContent_():
|
|
||||||
outfile.write('>\n')
|
|
||||||
self.exportChildren(outfile, level + 1, namespace_, name_)
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('</%s%s>\n' % (namespace_, name_))
|
|
||||||
else:
|
|
||||||
outfile.write(' />\n')
|
|
||||||
def exportAttributes(self, outfile, level, namespace_='', name_='CompoundType'):
|
|
||||||
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
|
||||||
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
|
||||||
def exportChildren(self, outfile, level, namespace_='', name_='CompoundType'):
|
|
||||||
if self.name is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
|
||||||
for member_ in self.member:
|
|
||||||
member_.export(outfile, level, namespace_, name_='member')
|
|
||||||
def hasContent_(self):
|
|
||||||
if (
|
|
||||||
self.name is not None or
|
|
||||||
self.member is not None
|
|
||||||
):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
def exportLiteral(self, outfile, level, name_='CompoundType'):
|
|
||||||
level += 1
|
|
||||||
self.exportLiteralAttributes(outfile, level, name_)
|
|
||||||
if self.hasContent_():
|
|
||||||
self.exportLiteralChildren(outfile, level, name_)
|
|
||||||
def exportLiteralAttributes(self, outfile, level, name_):
|
|
||||||
if self.kind is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('kind = "%s",\n' % (self.kind,))
|
|
||||||
if self.refid is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('refid = %s,\n' % (self.refid,))
|
|
||||||
def exportLiteralChildren(self, outfile, level, name_):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('member=[\n')
|
|
||||||
level += 1
|
|
||||||
for member in self.member:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('model_.member(\n')
|
|
||||||
member.exportLiteral(outfile, level, name_='member')
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('),\n')
|
|
||||||
level -= 1
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('],\n')
|
|
||||||
def build(self, node_):
|
|
||||||
attrs = node_.attributes
|
|
||||||
self.buildAttributes(attrs)
|
|
||||||
for child_ in node_.childNodes:
|
|
||||||
nodeName_ = child_.nodeName.split(':')[-1]
|
|
||||||
self.buildChildren(child_, nodeName_)
|
|
||||||
def buildAttributes(self, attrs):
|
|
||||||
if attrs.get('kind'):
|
|
||||||
self.kind = attrs.get('kind').value
|
|
||||||
if attrs.get('refid'):
|
|
||||||
self.refid = attrs.get('refid').value
|
|
||||||
def buildChildren(self, child_, nodeName_):
|
|
||||||
if child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'name':
|
|
||||||
name_ = ''
|
|
||||||
for text__content_ in child_.childNodes:
|
|
||||||
name_ += text__content_.nodeValue
|
|
||||||
self.name = name_
|
|
||||||
elif child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'member':
|
|
||||||
obj_ = MemberType.factory()
|
|
||||||
obj_.build(child_)
|
|
||||||
self.member.append(obj_)
|
|
||||||
# end class CompoundType
|
|
||||||
|
|
||||||
|
|
||||||
class MemberType(GeneratedsSuper):
|
|
||||||
subclass = None
|
|
||||||
superclass = None
|
|
||||||
def __init__(self, kind=None, refid=None, name=None):
|
|
||||||
self.kind = kind
|
|
||||||
self.refid = refid
|
|
||||||
self.name = name
|
|
||||||
def factory(*args_, **kwargs_):
|
|
||||||
if MemberType.subclass:
|
|
||||||
return MemberType.subclass(*args_, **kwargs_)
|
|
||||||
else:
|
|
||||||
return MemberType(*args_, **kwargs_)
|
|
||||||
factory = staticmethod(factory)
|
|
||||||
def get_name(self): return self.name
|
|
||||||
def set_name(self, name): self.name = name
|
|
||||||
def get_kind(self): return self.kind
|
|
||||||
def set_kind(self, kind): self.kind = kind
|
|
||||||
def get_refid(self): return self.refid
|
|
||||||
def set_refid(self, refid): self.refid = refid
|
|
||||||
def export(self, outfile, level, namespace_='', name_='MemberType', namespacedef_=''):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
|
||||||
self.exportAttributes(outfile, level, namespace_, name_='MemberType')
|
|
||||||
if self.hasContent_():
|
|
||||||
outfile.write('>\n')
|
|
||||||
self.exportChildren(outfile, level + 1, namespace_, name_)
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('</%s%s>\n' % (namespace_, name_))
|
|
||||||
else:
|
|
||||||
outfile.write(' />\n')
|
|
||||||
def exportAttributes(self, outfile, level, namespace_='', name_='MemberType'):
|
|
||||||
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
|
||||||
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
|
||||||
def exportChildren(self, outfile, level, namespace_='', name_='MemberType'):
|
|
||||||
if self.name is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
|
||||||
def hasContent_(self):
|
|
||||||
if (
|
|
||||||
self.name is not None
|
|
||||||
):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
def exportLiteral(self, outfile, level, name_='MemberType'):
|
|
||||||
level += 1
|
|
||||||
self.exportLiteralAttributes(outfile, level, name_)
|
|
||||||
if self.hasContent_():
|
|
||||||
self.exportLiteralChildren(outfile, level, name_)
|
|
||||||
def exportLiteralAttributes(self, outfile, level, name_):
|
|
||||||
if self.kind is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('kind = "%s",\n' % (self.kind,))
|
|
||||||
if self.refid is not None:
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('refid = %s,\n' % (self.refid,))
|
|
||||||
def exportLiteralChildren(self, outfile, level, name_):
|
|
||||||
showIndent(outfile, level)
|
|
||||||
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
|
||||||
def build(self, node_):
|
|
||||||
attrs = node_.attributes
|
|
||||||
self.buildAttributes(attrs)
|
|
||||||
for child_ in node_.childNodes:
|
|
||||||
nodeName_ = child_.nodeName.split(':')[-1]
|
|
||||||
self.buildChildren(child_, nodeName_)
|
|
||||||
def buildAttributes(self, attrs):
|
|
||||||
if attrs.get('kind'):
|
|
||||||
self.kind = attrs.get('kind').value
|
|
||||||
if attrs.get('refid'):
|
|
||||||
self.refid = attrs.get('refid').value
|
|
||||||
def buildChildren(self, child_, nodeName_):
|
|
||||||
if child_.nodeType == Node.ELEMENT_NODE and \
|
|
||||||
nodeName_ == 'name':
|
|
||||||
name_ = ''
|
|
||||||
for text__content_ in child_.childNodes:
|
|
||||||
name_ += text__content_.nodeValue
|
|
||||||
self.name = name_
|
|
||||||
# end class MemberType
|
|
||||||
|
|
||||||
|
|
||||||
USAGE_TEXT = """
|
|
||||||
Usage: python <Parser>.py [ -s ] <in_xml_file>
|
|
||||||
Options:
|
|
||||||
-s Use the SAX parser, not the minidom parser.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def usage():
|
|
||||||
print USAGE_TEXT
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def parse(inFileName):
|
|
||||||
doc = minidom.parse(inFileName)
|
|
||||||
rootNode = doc.documentElement
|
|
||||||
rootObj = DoxygenType.factory()
|
|
||||||
rootObj.build(rootNode)
|
|
||||||
# Enable Python to collect the space used by the DOM.
|
|
||||||
doc = None
|
|
||||||
sys.stdout.write('<?xml version="1.0" ?>\n')
|
|
||||||
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
|
||||||
namespacedef_='')
|
|
||||||
return rootObj
|
|
||||||
|
|
||||||
|
|
||||||
def parseString(inString):
|
|
||||||
doc = minidom.parseString(inString)
|
|
||||||
rootNode = doc.documentElement
|
|
||||||
rootObj = DoxygenType.factory()
|
|
||||||
rootObj.build(rootNode)
|
|
||||||
# Enable Python to collect the space used by the DOM.
|
|
||||||
doc = None
|
|
||||||
sys.stdout.write('<?xml version="1.0" ?>\n')
|
|
||||||
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
|
||||||
namespacedef_='')
|
|
||||||
return rootObj
|
|
||||||
|
|
||||||
|
|
||||||
def parseLiteral(inFileName):
|
|
||||||
doc = minidom.parse(inFileName)
|
|
||||||
rootNode = doc.documentElement
|
|
||||||
rootObj = DoxygenType.factory()
|
|
||||||
rootObj.build(rootNode)
|
|
||||||
# Enable Python to collect the space used by the DOM.
|
|
||||||
doc = None
|
|
||||||
sys.stdout.write('from index import *\n\n')
|
|
||||||
sys.stdout.write('rootObj = doxygenindex(\n')
|
|
||||||
rootObj.exportLiteral(sys.stdout, 0, name_="doxygenindex")
|
|
||||||
sys.stdout.write(')\n')
|
|
||||||
return rootObj
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
args = sys.argv[1:]
|
|
||||||
if len(args) == 1:
|
|
||||||
parse(args[0])
|
|
||||||
else:
|
|
||||||
usage()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
#import pdb
|
|
||||||
#pdb.run('main()')
|
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# 1st parameter is absolute path to component source directory
|
|
||||||
# 2nd parameter is absolute path to component build directory
|
|
||||||
# 3rd parameter is path to Python QA directory
|
|
||||||
|
|
||||||
# Note: calling master run_tests.sh in gnuradio core is not strictly
|
|
||||||
# correct, as it will result in a partially bogus PYTHONPATH, but it
|
|
||||||
# does make the correct paths in the second half so all is well.
|
|
||||||
|
|
||||||
@PYTHON@ @srcdir@/__init__.py
|
|
||||||
|
|
||||||
# @top_builddir@/run_tests.sh \
|
|
||||||
# @abs_top_srcdir@/gnuradio-core \
|
|
||||||
# @abs_top_builddir@/gnuradio-core \
|
|
||||||
# @srcdir@
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2010 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
Utilities for extracting text from generated classes.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def is_string(txt):
|
|
||||||
if isinstance(txt, str):
|
|
||||||
return True
|
|
||||||
try:
|
|
||||||
if isinstance(txt, unicode):
|
|
||||||
return True
|
|
||||||
except NameError:
|
|
||||||
pass
|
|
||||||
return False
|
|
||||||
|
|
||||||
def description(obj):
|
|
||||||
if obj is None:
|
|
||||||
return None
|
|
||||||
return description_bit(obj).strip()
|
|
||||||
|
|
||||||
def description_bit(obj):
|
|
||||||
if hasattr(obj, 'content'):
|
|
||||||
contents = [description_bit(item) for item in obj.content]
|
|
||||||
result = ''.join(contents)
|
|
||||||
elif hasattr(obj, 'content_'):
|
|
||||||
contents = [description_bit(item) for item in obj.content_]
|
|
||||||
result = ''.join(contents)
|
|
||||||
elif hasattr(obj, 'value'):
|
|
||||||
result = description_bit(obj.value)
|
|
||||||
elif is_string(obj):
|
|
||||||
return obj
|
|
||||||
else:
|
|
||||||
raise StandardError('Expecting a string or something with content, content_ or value attribute')
|
|
||||||
# If this bit is a paragraph then add one some line breaks.
|
|
||||||
if hasattr(obj, 'name') and obj.name == 'para':
|
|
||||||
result += "\n\n"
|
|
||||||
return result
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
/*!
|
|
||||||
* \defgroup block GNU Radio HOWTO C++ Signal Processing Blocks
|
|
||||||
* \brief All C++ blocks that can be used from the HOWTO GNU Radio
|
|
||||||
* module are listed here or in the subcategories below.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
/*! \mainpage
|
|
||||||
|
|
||||||
Welcome to the GNU Radio HOWTO Block
|
|
||||||
|
|
||||||
This is the intro page for the Doxygen manual generated for the HOWTO
|
|
||||||
block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
|
|
||||||
documentation about the new GNU Radio modules contained in this
|
|
||||||
project.
|
|
||||||
|
|
||||||
*/
|
|
||||||
@@ -1,255 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright 2010,2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of GNU Radio
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
Creates the swig_doc.i SWIG interface file.
|
|
||||||
Execute using: python swig_doc.py xml_path outputfilename
|
|
||||||
|
|
||||||
The file instructs SWIG to transfer the doxygen comments into the
|
|
||||||
python docstrings.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
try:
|
|
||||||
from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
|
|
||||||
except ImportError:
|
|
||||||
from gnuradio.doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
|
|
||||||
|
|
||||||
|
|
||||||
def py_name(name):
|
|
||||||
bits = name.split('_')
|
|
||||||
return '_'.join(bits[1:])
|
|
||||||
|
|
||||||
def make_name(name):
|
|
||||||
bits = name.split('_')
|
|
||||||
return bits[0] + '_make_' + '_'.join(bits[1:])
|
|
||||||
|
|
||||||
|
|
||||||
class Block(object):
|
|
||||||
"""
|
|
||||||
Checks if doxyxml produced objects correspond to a gnuradio block.
|
|
||||||
"""
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def includes(cls, item):
|
|
||||||
if not isinstance(item, DoxyClass):
|
|
||||||
return False
|
|
||||||
# Check for a parsing error.
|
|
||||||
if item.error():
|
|
||||||
return False
|
|
||||||
return item.has_member(make_name(item.name()), DoxyFriend)
|
|
||||||
|
|
||||||
|
|
||||||
def utoascii(text):
|
|
||||||
"""
|
|
||||||
Convert unicode text into ascii and escape quotes.
|
|
||||||
"""
|
|
||||||
if text is None:
|
|
||||||
return ''
|
|
||||||
out = text.encode('ascii', 'replace')
|
|
||||||
out = out.replace('"', '\\"')
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
def combine_descriptions(obj):
|
|
||||||
"""
|
|
||||||
Combines the brief and detailed descriptions of an object together.
|
|
||||||
"""
|
|
||||||
description = []
|
|
||||||
bd = obj.brief_description.strip()
|
|
||||||
dd = obj.detailed_description.strip()
|
|
||||||
if bd:
|
|
||||||
description.append(bd)
|
|
||||||
if dd:
|
|
||||||
description.append(dd)
|
|
||||||
return utoascii('\n\n'.join(description)).strip()
|
|
||||||
|
|
||||||
|
|
||||||
entry_templ = '%feature("docstring") {name} "{docstring}"'
|
|
||||||
def make_entry(obj, name=None, templ="{description}", description=None):
|
|
||||||
"""
|
|
||||||
Create a docstring entry for a swig interface file.
|
|
||||||
|
|
||||||
obj - a doxyxml object from which documentation will be extracted.
|
|
||||||
name - the name of the C object (defaults to obj.name())
|
|
||||||
templ - an optional template for the docstring containing only one
|
|
||||||
variable named 'description'.
|
|
||||||
description - if this optional variable is set then it's value is
|
|
||||||
used as the description instead of extracting it from obj.
|
|
||||||
"""
|
|
||||||
if name is None:
|
|
||||||
name=obj.name()
|
|
||||||
if "operator " in name:
|
|
||||||
return ''
|
|
||||||
if description is None:
|
|
||||||
description = combine_descriptions(obj)
|
|
||||||
docstring = templ.format(description=description)
|
|
||||||
if not docstring:
|
|
||||||
return ''
|
|
||||||
return entry_templ.format(
|
|
||||||
name=name,
|
|
||||||
docstring=docstring,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def make_func_entry(func, name=None, description=None, params=None):
|
|
||||||
"""
|
|
||||||
Create a function docstring entry for a swig interface file.
|
|
||||||
|
|
||||||
func - a doxyxml object from which documentation will be extracted.
|
|
||||||
name - the name of the C object (defaults to func.name())
|
|
||||||
description - if this optional variable is set then it's value is
|
|
||||||
used as the description instead of extracting it from func.
|
|
||||||
params - a parameter list that overrides using func.params.
|
|
||||||
"""
|
|
||||||
if params is None:
|
|
||||||
params = func.params
|
|
||||||
params = [prm.declname for prm in params]
|
|
||||||
if params:
|
|
||||||
sig = "Params: (%s)" % ", ".join(params)
|
|
||||||
else:
|
|
||||||
sig = "Params: (NONE)"
|
|
||||||
templ = "{description}\n\n" + sig
|
|
||||||
return make_entry(func, name=name, templ=utoascii(templ),
|
|
||||||
description=description)
|
|
||||||
|
|
||||||
|
|
||||||
def make_class_entry(klass, description=None):
|
|
||||||
"""
|
|
||||||
Create a class docstring for a swig interface file.
|
|
||||||
"""
|
|
||||||
output = []
|
|
||||||
output.append(make_entry(klass, description=description))
|
|
||||||
for func in klass.in_category(DoxyFunction):
|
|
||||||
name = klass.name() + '::' + func.name()
|
|
||||||
output.append(make_func_entry(func, name=name))
|
|
||||||
return "\n\n".join(output)
|
|
||||||
|
|
||||||
|
|
||||||
def make_block_entry(di, block):
|
|
||||||
"""
|
|
||||||
Create class and function docstrings of a gnuradio block for a
|
|
||||||
swig interface file.
|
|
||||||
"""
|
|
||||||
descriptions = []
|
|
||||||
# Get the documentation associated with the class.
|
|
||||||
class_desc = combine_descriptions(block)
|
|
||||||
if class_desc:
|
|
||||||
descriptions.append(class_desc)
|
|
||||||
# Get the documentation associated with the make function
|
|
||||||
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
|
||||||
make_func_desc = combine_descriptions(make_func)
|
|
||||||
if make_func_desc:
|
|
||||||
descriptions.append(make_func_desc)
|
|
||||||
# Get the documentation associated with the file
|
|
||||||
try:
|
|
||||||
block_file = di.get_member(block.name() + ".h", DoxyFile)
|
|
||||||
file_desc = combine_descriptions(block_file)
|
|
||||||
if file_desc:
|
|
||||||
descriptions.append(file_desc)
|
|
||||||
except base.Base.NoSuchMember:
|
|
||||||
# Don't worry if we can't find a matching file.
|
|
||||||
pass
|
|
||||||
# And join them all together to make a super duper description.
|
|
||||||
super_description = "\n\n".join(descriptions)
|
|
||||||
# Associate the combined description with the class and
|
|
||||||
# the make function.
|
|
||||||
output = []
|
|
||||||
output.append(make_class_entry(block, description=super_description))
|
|
||||||
creator = block.get_member(block.name(), DoxyFunction)
|
|
||||||
output.append(make_func_entry(make_func, description=super_description,
|
|
||||||
params=creator.params))
|
|
||||||
return "\n\n".join(output)
|
|
||||||
|
|
||||||
|
|
||||||
def make_swig_interface_file(di, swigdocfilename, custom_output=None):
|
|
||||||
|
|
||||||
output = ["""
|
|
||||||
/*
|
|
||||||
* This file was automatically generated using swig_doc.py.
|
|
||||||
*
|
|
||||||
* Any changes to it will be lost next time it is regenerated.
|
|
||||||
*/
|
|
||||||
"""]
|
|
||||||
|
|
||||||
if custom_output is not None:
|
|
||||||
output.append(custom_output)
|
|
||||||
|
|
||||||
# Create docstrings for the blocks.
|
|
||||||
blocks = di.in_category(Block)
|
|
||||||
make_funcs = set([])
|
|
||||||
for block in blocks:
|
|
||||||
try:
|
|
||||||
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
|
||||||
make_funcs.add(make_func.name())
|
|
||||||
output.append(make_block_entry(di, block))
|
|
||||||
except block.ParsingError:
|
|
||||||
print('Parsing error for block %s' % block.name())
|
|
||||||
|
|
||||||
# Create docstrings for functions
|
|
||||||
# Don't include the make functions since they have already been dealt with.
|
|
||||||
funcs = [f for f in di.in_category(DoxyFunction) if f.name() not in make_funcs]
|
|
||||||
for f in funcs:
|
|
||||||
try:
|
|
||||||
output.append(make_func_entry(f))
|
|
||||||
except f.ParsingError:
|
|
||||||
print('Parsing error for function %s' % f.name())
|
|
||||||
|
|
||||||
# Create docstrings for classes
|
|
||||||
block_names = [block.name() for block in blocks]
|
|
||||||
klasses = [k for k in di.in_category(DoxyClass) if k.name() not in block_names]
|
|
||||||
for k in klasses:
|
|
||||||
try:
|
|
||||||
output.append(make_class_entry(k))
|
|
||||||
except k.ParsingError:
|
|
||||||
print('Parsing error for class %s' % k.name())
|
|
||||||
|
|
||||||
# Docstrings are not created for anything that is not a function or a class.
|
|
||||||
# If this excludes anything important please add it here.
|
|
||||||
|
|
||||||
output = "\n\n".join(output)
|
|
||||||
|
|
||||||
swig_doc = file(swigdocfilename, 'w')
|
|
||||||
swig_doc.write(output)
|
|
||||||
swig_doc.close()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
# Parse command line options and set up doxyxml.
|
|
||||||
err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
|
|
||||||
if len(sys.argv) != 3:
|
|
||||||
raise StandardError(err_msg)
|
|
||||||
xml_path = sys.argv[1]
|
|
||||||
swigdocfilename = sys.argv[2]
|
|
||||||
di = DoxyIndex(xml_path)
|
|
||||||
|
|
||||||
# gnuradio.gr.msq_queue.insert_tail and delete_head create errors unless docstrings are defined!
|
|
||||||
# This is presumably a bug in SWIG.
|
|
||||||
#msg_q = di.get_member(u'gr_msg_queue', DoxyClass)
|
|
||||||
#insert_tail = msg_q.get_member(u'insert_tail', DoxyFunction)
|
|
||||||
#delete_head = msg_q.get_member(u'delete_head', DoxyFunction)
|
|
||||||
output = []
|
|
||||||
#output.append(make_func_entry(insert_tail, name='gr_py_msg_queue__insert_tail'))
|
|
||||||
#output.append(make_func_entry(delete_head, name='gr_py_msg_queue__delete_head'))
|
|
||||||
custom_output = "\n\n".join(output)
|
|
||||||
|
|
||||||
# Generate the docstrings interface file.
|
|
||||||
make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
|
|
||||||
+687
-1270
File diff suppressed because it is too large
Load Diff
+771
-1980
File diff suppressed because it is too large
Load Diff
+1070
-2781
File diff suppressed because it is too large
Load Diff
+1128
-2675
File diff suppressed because it is too large
Load Diff
+945
-1911
File diff suppressed because it is too large
Load Diff
+31
-2
@@ -1,3 +1,32 @@
|
|||||||
file(GLOB xml_files "*.xml")
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-ieee802_11
|
||||||
|
#
|
||||||
|
# GNU Radio is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# GNU Radio is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with GNU Radio; see the file COPYING. If not, write to
|
||||||
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
# Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
install(FILES ${xml_files} DESTINATION share/gnuradio/grc/blocks )
|
install(FILES
|
||||||
|
ieee802_11_chunks_to_symbols.block.yml
|
||||||
|
ieee802_11_decode_mac.block.yml
|
||||||
|
ieee802_11_ether_encap.block.yml
|
||||||
|
ieee802_11_extract_csi.block.yml
|
||||||
|
ieee802_11_frame_equalizer.block.yml
|
||||||
|
ieee802_11_mac.block.yml
|
||||||
|
ieee802_11_mapper.block.yml
|
||||||
|
ieee802_11_parse_mac.block.yml
|
||||||
|
ieee802_11_sync_long.block.yml
|
||||||
|
ieee802_11_sync_short.block.yml DESTINATION share/gnuradio/grc/blocks
|
||||||
|
)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_chunks_to_symbols_xx
|
||||||
|
label: Chunks to Symbols
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
multiplicity: '1'
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.chunks_to_symbols()
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Chunks to Symbols</name>
|
|
||||||
<key>ieee802_11_chunks_to_symbols_xx</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.chunks_to_symbols()</make>
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>byte</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_decode_mac
|
||||||
|
label: WiFi Decode MAC
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: log
|
||||||
|
label: Log
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
vlen: 48
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: out
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.decode_mac(${log}, ${debug})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_ether_encap
|
||||||
|
label: Ethernet Encapsulation
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: message
|
||||||
|
id: from tap
|
||||||
|
optional: true
|
||||||
|
- domain: message
|
||||||
|
id: from wifi
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: to tap
|
||||||
|
optional: true
|
||||||
|
- domain: message
|
||||||
|
id: to wifi
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.ether_encap(${debug})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>Ethernet Encapsulation</name>
|
|
||||||
<key>ieee802_11_ether_encap</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ether_encap($debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>from tap</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>from wifi</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>to tap</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>to wifi</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
id: ieee802_11_extract_csi
|
||||||
|
label: WiFi Extract CSI
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.extract_csi()
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- label: pdu in
|
||||||
|
domain: message
|
||||||
|
optional: false
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- label: csi out
|
||||||
|
domain: stream
|
||||||
|
dtype: complex
|
||||||
|
vlen: 52
|
||||||
|
optional: false
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_frame_equalizer
|
||||||
|
label: WiFi Frame Equalizer
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: algo
|
||||||
|
label: Algorithm
|
||||||
|
dtype: int
|
||||||
|
default: ieee802_11.LS
|
||||||
|
options: [ieee802_11.LS, ieee802_11.LMS, ieee802_11.COMB, ieee802_11.STA]
|
||||||
|
option_labels: [LS, LMS, Comb, STA]
|
||||||
|
- id: freq
|
||||||
|
label: Frequency
|
||||||
|
dtype: real
|
||||||
|
default: 5.89e9
|
||||||
|
- id: bw
|
||||||
|
label: Bandwidth
|
||||||
|
dtype: real
|
||||||
|
default: 10e6
|
||||||
|
- id: log
|
||||||
|
label: Log
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
vlen: 64
|
||||||
|
multiplicity: '1'
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
vlen: 48
|
||||||
|
multiplicity: '1'
|
||||||
|
- domain: message
|
||||||
|
id: symbols
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.frame_equalizer(${algo}, ${freq}, ${bw}, ${log}, ${debug})
|
||||||
|
callbacks:
|
||||||
|
- set_algorithm(${algo})
|
||||||
|
- set_frequency(${freq})
|
||||||
|
- set_bandwidth(${bw})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_mac
|
||||||
|
label: WiFi MAC
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: src_mac
|
||||||
|
label: SRC MAC
|
||||||
|
dtype: int_vector
|
||||||
|
default: '[0x23, 0x23, 0x23, 0x23, 0x23, 0x23]'
|
||||||
|
- id: dst_mac
|
||||||
|
label: DST MAC
|
||||||
|
dtype: int_vector
|
||||||
|
default: '[0x42, 0x42, 0x42, 0x42, 0x42, 0x42]'
|
||||||
|
- id: bss_mac
|
||||||
|
label: BSS MAC
|
||||||
|
dtype: int_vector
|
||||||
|
default: '[0xff, 0xff, 0xff, 0xff, 0xff, 0xff]'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: message
|
||||||
|
id: app in
|
||||||
|
optional: true
|
||||||
|
- domain: message
|
||||||
|
id: phy in
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: app out
|
||||||
|
optional: true
|
||||||
|
- domain: message
|
||||||
|
id: phy out
|
||||||
|
optional: true
|
||||||
|
asserts:
|
||||||
|
- ${ len(src_mac) == 6 }
|
||||||
|
- ${ len(dst_mac) == 6 }
|
||||||
|
- ${ len(bss_mac) == 6 }
|
||||||
|
- ${ all([x >= 0 and 255 >= x for x in src_mac]) }
|
||||||
|
- ${ all([x >= 0 and 255 >= x for x in dst_mac]) }
|
||||||
|
- ${ all([x >= 0 and 255 >= x for x in bss_mac]) }
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.mac(${src_mac}, ${dst_mac}, ${bss_mac})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_mapper
|
||||||
|
label: WiFi Mapper
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: encoding
|
||||||
|
label: Encoding
|
||||||
|
dtype: int
|
||||||
|
default: ieee802_11.BPSK_1_2
|
||||||
|
options: [ieee802_11.BPSK_1_2, ieee802_11.BPSK_3_4, ieee802_11.QPSK_1_2, ieee802_11.QPSK_3_4,
|
||||||
|
ieee802_11.16QAM_1_2, ieee802_11.16QAM_3_4, ieee802_11.64QAM_2_3, ieee802_11.64QAM_3_4]
|
||||||
|
option_labels: [BPSK 1/2, BPSK 3/4, QPSK 1/2, QPSK 3/4, 16QAM 1/2, 16QAM 3/4,
|
||||||
|
64QAM 2/3, 64QAM 3/4]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: message
|
||||||
|
id: in
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
multiplicity: '1'
|
||||||
|
asserts:
|
||||||
|
- ${ encoding in range(8) }
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.mapper(${encoding}, ${debug})
|
||||||
|
callbacks:
|
||||||
|
- set_encoding(${encoding})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Moving Average</name>
|
|
||||||
<key>ieee802_11_moving_average_xx</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.moving_average_$(type.fcn)($length)</make>
|
|
||||||
<callback>set_length($length)</callback>
|
|
||||||
<param>
|
|
||||||
<name>Type</name>
|
|
||||||
<key>type</key>
|
|
||||||
<type>enum</type>
|
|
||||||
<option>
|
|
||||||
<name>Complex</name>
|
|
||||||
<key>complex</key>
|
|
||||||
<opt>fcn:cc</opt>
|
|
||||||
<opt>scale:complex</opt>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Float</name>
|
|
||||||
<key>float</key>
|
|
||||||
<opt>fcn:ff</opt>
|
|
||||||
<opt>scale:real</opt>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Length</name>
|
|
||||||
<key>length</key>
|
|
||||||
<value>48</value>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>$type</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>$type</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Decode MAC</name>
|
|
||||||
<key>ieee802_11_ofdm_decode_mac</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_decode_mac($log, $debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Log</name>
|
|
||||||
<key>log</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<vlen>48</vlen>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>message</type>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Decode Signal</name>
|
|
||||||
<key>ieee802_11_ofdm_decode_signal</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_decode_signal($log, $debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Log</name>
|
|
||||||
<key>log</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<vlen>48</vlen>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<vlen>48</vlen>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Equalize Symbols</name>
|
|
||||||
<key>ieee802_11_ofdm_equalize_symbols</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_equalize_symbols($algo, $debug)</make>
|
|
||||||
<callback>set_algorithm($algo)</callback>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Algorithm</name>
|
|
||||||
<key>algo</key>
|
|
||||||
<value>ieee802_11.LINEAR_COMB</value>
|
|
||||||
<type>int</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>LMS</name>
|
|
||||||
<key>ieee802_11.LMS</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>linear comb</name>
|
|
||||||
<key>ieee802_11.LINEAR_COMB</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<vlen>64</vlen>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<vlen>48</vlen>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM MAC</name>
|
|
||||||
<key>ieee802_11_ofdm_mac</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_mac($src_mac, $dst_mac, $bss_mac)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>SRC MAC</name>
|
|
||||||
<key>src_mac</key>
|
|
||||||
<value>[0x23, 0x23, 0x23, 0x23, 0x23, 0x23]</value>
|
|
||||||
<type>int_vector</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>DST MAC</name>
|
|
||||||
<key>dst_mac</key>
|
|
||||||
<value>[0x42, 0x42, 0x42, 0x42, 0x42, 0x42]</value>
|
|
||||||
<type>int_vector</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>BSS MAC</name>
|
|
||||||
<key>bss_mac</key>
|
|
||||||
<value>[0xff, 0xff, 0xff, 0xff, 0xff, 0xff]</value>
|
|
||||||
<type>int_vector</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<check>len($src_mac) == 6</check>
|
|
||||||
<check>len($dst_mac) == 6</check>
|
|
||||||
<check>len($bss_mac) == 6</check>
|
|
||||||
<check>all([x >= 0 and 255 >= x for x in $src_mac])</check>
|
|
||||||
<check>all([x >= 0 and 255 >= x for x in $dst_mac])</check>
|
|
||||||
<check>all([x >= 0 and 255 >= x for x in $bss_mac])</check>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>app in</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>phy in</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>app out</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>phy out</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Mapper</name>
|
|
||||||
<key>ieee802_11_ofdm_mapper</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_mapper($encoding, $debug)</make>
|
|
||||||
<callback>set_encoding($encoding)</callback>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Encoding</name>
|
|
||||||
<key>encoding</key>
|
|
||||||
<value>ieee802_11.BPSK_1_2</value>
|
|
||||||
<type>int</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>BPSK 1/2</name>
|
|
||||||
<key>ieee802_11.BPSK_1_2</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>BPSK 3/4</name>
|
|
||||||
<key>ieee802_11.BPSK_3_4</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>QPSK 1/2</name>
|
|
||||||
<key>ieee802_11.QPSK_1_2</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>QPSK 3/4</name>
|
|
||||||
<key>ieee802_11.QPSK_3_4</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>16QAM 1/2</name>
|
|
||||||
<key>ieee802_11.16QAM_1_2</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>16QAM 3/4</name>
|
|
||||||
<key>ieee802_11.16QAM_3_4</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>64QAM 2/3</name>
|
|
||||||
<key>ieee802_11.64QAM_2_3</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>64QAM 3/4</name>
|
|
||||||
<key>ieee802_11.64QAM_3_4</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<check>$encoding in range(8)</check>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>message</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>byte</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Parse MAC</name>
|
|
||||||
<key>ieee802_11_ofdm_parse_mac</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_parse_mac($log, $debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Log</name>
|
|
||||||
<key>log</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>message</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>fer</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Sync Long</name>
|
|
||||||
<key>ieee802_11_ofdm_sync_long</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_sync_long($sync_length, $log, $debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Log</name>
|
|
||||||
<key>log</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Sync Length</name>
|
|
||||||
<key>sync_length</key>
|
|
||||||
<value>240</value>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<check>$sync_length > 0</check>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in delayed</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
<block>
|
|
||||||
<name>OFDM Sync Short</name>
|
|
||||||
<key>ieee802_11_ofdm_sync_short</key>
|
|
||||||
<category>IEEE802.11</category>
|
|
||||||
<import>import ieee802_11</import>
|
|
||||||
<make>ieee802_11.ofdm_sync_short($threshold, $min_plateau, $log, $debug)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Log</name>
|
|
||||||
<key>log</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Debug</name>
|
|
||||||
<key>debug</key>
|
|
||||||
<value>False</value>
|
|
||||||
<type>bool</type>
|
|
||||||
|
|
||||||
<option>
|
|
||||||
<name>Enable</name>
|
|
||||||
<key>True</key>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Disable</name>
|
|
||||||
<key>False</key>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Threshold</name>
|
|
||||||
<key>threshold</key>
|
|
||||||
<value>0.8</value>
|
|
||||||
<type>real</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Min Plateau</name>
|
|
||||||
<key>min_plateau</key>
|
|
||||||
<value>2</value>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<check>$threshold > 0</check>
|
|
||||||
<check>$min_plateau > 0</check>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>abs</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>cor</name>
|
|
||||||
<type>float</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
<nports>1</nports>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_parse_mac
|
||||||
|
label: WiFi Parse MAC
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: log
|
||||||
|
label: Log
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: message
|
||||||
|
id: in
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: out
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.parse_mac(${log}, ${debug})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_sync_long
|
||||||
|
label: WiFi Sync Long
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: log
|
||||||
|
label: Log
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: sync_length
|
||||||
|
label: Sync Length
|
||||||
|
dtype: int
|
||||||
|
default: '240'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
- label: in delayed
|
||||||
|
domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
asserts:
|
||||||
|
- ${ sync_length > 0 }
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.sync_long(${sync_length}, ${log}, ${debug})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: ieee802_11_sync_short
|
||||||
|
label: WiFi Sync Short
|
||||||
|
category: '[IEEE802.11]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: log
|
||||||
|
label: Log
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: debug
|
||||||
|
label: Debug
|
||||||
|
dtype: bool
|
||||||
|
default: 'False'
|
||||||
|
options: ['True', 'False']
|
||||||
|
option_labels: [Enable, Disable]
|
||||||
|
- id: threshold
|
||||||
|
label: Threshold
|
||||||
|
dtype: real
|
||||||
|
default: '0.8'
|
||||||
|
- id: min_plateau
|
||||||
|
label: Min Plateau
|
||||||
|
dtype: int
|
||||||
|
default: '2'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
- label: abs
|
||||||
|
domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
- label: cor
|
||||||
|
domain: stream
|
||||||
|
dtype: float
|
||||||
|
multiplicity: '1'
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
multiplicity: '1'
|
||||||
|
asserts:
|
||||||
|
- ${ threshold > 0 }
|
||||||
|
- ${ min_plateau > 0 }
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import ieee802_11
|
||||||
|
make: ieee802_11.sync_short(${threshold}, ${min_plateau}, ${log}, ${debug})
|
||||||
|
|
||||||
|
file_format: 1
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py "
|
|
||||||
#!${PYTHON_EXECUTABLE}
|
|
||||||
|
|
||||||
import sys, os, re
|
|
||||||
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.path.append('${CMAKE_CURRENT_SOURCE_DIR}/../../python')
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_dict(name, sig, 'ieee802_11')
|
|
||||||
build_utils.expand_template(d, inp)
|
|
||||||
|
|
||||||
")
|
|
||||||
|
|
||||||
macro(expand_h root)
|
|
||||||
#make a list of all the generated files
|
|
||||||
unset(expanded_files_h)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
|
|
||||||
#create a command to generate the files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated h files
|
|
||||||
list(APPEND generated_includes ${expanded_files_h})
|
|
||||||
endmacro(expand_h)
|
|
||||||
|
|
||||||
expand_h(moving_average_XX ff cc)
|
|
||||||
|
|
||||||
add_custom_target(ieee802_11_generated_includes DEPENDS
|
|
||||||
${generated_includes}
|
|
||||||
)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Install public header files
|
|
||||||
########################################################################
|
|
||||||
|
|
||||||
list(APPEND include_sources
|
|
||||||
${generated_includes}
|
|
||||||
api.h
|
|
||||||
chunks_to_symbols.h
|
|
||||||
ether_encap.h
|
|
||||||
ofdm_decode_mac.h
|
|
||||||
ofdm_decode_signal.h
|
|
||||||
ofdm_equalize_symbols.h
|
|
||||||
ofdm_mac.h
|
|
||||||
ofdm_mapper.h
|
|
||||||
ofdm_parse_mac.h
|
|
||||||
ofdm_sync_long.h
|
|
||||||
ofdm_sync_short.h
|
|
||||||
wifi_signal_field.h
|
|
||||||
)
|
|
||||||
|
|
||||||
install(
|
|
||||||
FILES ${include_sources}
|
|
||||||
DESTINATION ${GR_INCLUDE_DIR}/gnuradio/ieee802_11
|
|
||||||
COMPONENT "ieee802_11_devel"
|
|
||||||
)
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_SYNC_LONG_H
|
|
||||||
#define INCLUDED_IEEE802_11_OFDM_SYNC_LONG_H
|
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
|
||||||
|
|
||||||
namespace gr {
|
|
||||||
namespace ieee802_11 {
|
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_sync_long : virtual public block
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
typedef boost::shared_ptr<ofdm_sync_long> sptr;
|
|
||||||
static sptr make(unsigned int sync_length,
|
|
||||||
bool log = false, bool debug = false);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ieee802_11
|
|
||||||
} // namespace gr
|
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_SYNC_LONG_H */
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_SYNC_SHORT_H
|
|
||||||
#define INCLUDED_IEEE802_11_OFDM_SYNC_SHORT_H
|
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
|
||||||
|
|
||||||
namespace gr {
|
|
||||||
namespace ieee802_11 {
|
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_sync_short : virtual public block
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
typedef boost::shared_ptr<ofdm_sync_short> sptr;
|
|
||||||
static sptr make(double threshold, unsigned int min_plateau, bool log = false, bool debug = false);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ieee802_11
|
|
||||||
} // namespace gr
|
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_SYNC_SHORT_H */
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Install public header files
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
list(APPEND include_sources
|
||||||
|
api.h
|
||||||
|
chunks_to_symbols.h
|
||||||
|
constellations.h
|
||||||
|
decode_mac.h
|
||||||
|
ether_encap.h
|
||||||
|
extract_csi.h
|
||||||
|
frame_equalizer.h
|
||||||
|
mac.h
|
||||||
|
mapper.h
|
||||||
|
parse_mac.h
|
||||||
|
signal_field.h
|
||||||
|
sync_long.h
|
||||||
|
sync_short.h
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${include_sources}
|
||||||
|
DESTINATION ${GR_INCLUDE_DIR}
|
||||||
|
COMPONENT "ieee802_11_devel"
|
||||||
|
)
|
||||||
@@ -20,9 +20,9 @@
|
|||||||
#include <gnuradio/attributes.h>
|
#include <gnuradio/attributes.h>
|
||||||
|
|
||||||
#ifdef gnuradio_ieee802_11_EXPORTS
|
#ifdef gnuradio_ieee802_11_EXPORTS
|
||||||
# define IEEE802_11_API __GR_ATTR_EXPORT
|
#define IEEE802_11_API __GR_ATTR_EXPORT
|
||||||
#else
|
#else
|
||||||
# define IEEE802_11_API __GR_ATTR_IMPORT
|
#define IEEE802_11_API __GR_ATTR_IMPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_API_H */
|
#endif /* INCLUDED_IEEE802_11_API_H */
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
#ifndef INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_H
|
#ifndef INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_H
|
||||||
#define INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_H
|
#define INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/tagged_stream_block.h>
|
#include <gnuradio/tagged_stream_block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
@@ -26,8 +26,8 @@ namespace ieee802_11 {
|
|||||||
class IEEE802_11_API chunks_to_symbols : virtual public tagged_stream_block
|
class IEEE802_11_API chunks_to_symbols : virtual public tagged_stream_block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<chunks_to_symbols> sptr;
|
typedef boost::shared_ptr<chunks_to_symbols> sptr;
|
||||||
static sptr make();
|
static sptr make();
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace ieee802_11 */
|
} /* namespace ieee802_11 */
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_H
|
||||||
|
#define INCLUDED_IEEE802_11_CONSTELLATIONS_H
|
||||||
|
|
||||||
|
#include <gnuradio/digital/constellation.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace ieee802_11 {
|
||||||
|
|
||||||
|
class IEEE802_11_API constellation_bpsk : virtual public digital::constellation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<gr::ieee802_11::constellation_bpsk> sptr;
|
||||||
|
static sptr make();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
constellation_bpsk();
|
||||||
|
};
|
||||||
|
|
||||||
|
class IEEE802_11_API constellation_qpsk : virtual public digital::constellation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<gr::ieee802_11::constellation_qpsk> sptr;
|
||||||
|
static sptr make();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
constellation_qpsk();
|
||||||
|
};
|
||||||
|
|
||||||
|
class IEEE802_11_API constellation_16qam : virtual public digital::constellation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<gr::ieee802_11::constellation_16qam> sptr;
|
||||||
|
static sptr make();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
constellation_16qam();
|
||||||
|
};
|
||||||
|
|
||||||
|
class IEEE802_11_API constellation_64qam : virtual public digital::constellation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<gr::ieee802_11::constellation_64qam> sptr;
|
||||||
|
static sptr make();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
constellation_64qam();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ieee802_11
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,25 +14,23 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_PARSE_MAC_H
|
#ifndef INCLUDED_IEEE802_11_DECODE_MAC_H
|
||||||
#define INCLUDED_IEEE802_11_OFDM_PARSE_MAC_H
|
#define INCLUDED_IEEE802_11_DECODE_MAC_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_parse_mac : virtual public block
|
class IEEE802_11_API decode_mac : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<decode_mac> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_parse_mac> sptr;
|
static sptr make(bool log = false, bool debug = false);
|
||||||
static sptr make(bool log = false, bool debug = false);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_PARSE_MAC_H */
|
#endif /* INCLUDED_IEEE802_11_DECODE_MAC_H */
|
||||||
@@ -17,8 +17,8 @@
|
|||||||
#ifndef INCLUDED_IEEE802_11_ETHER_ENCAP_H
|
#ifndef INCLUDED_IEEE802_11_ETHER_ENCAP_H
|
||||||
#define INCLUDED_IEEE802_11_ETHER_ENCAP_H
|
#define INCLUDED_IEEE802_11_ETHER_ENCAP_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
@@ -26,13 +26,11 @@ namespace ieee802_11 {
|
|||||||
class IEEE802_11_API ether_encap : virtual public block
|
class IEEE802_11_API ether_encap : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<ether_encap> sptr;
|
||||||
typedef boost::shared_ptr<ether_encap> sptr;
|
static sptr make(bool debug);
|
||||||
static sptr make(bool debug);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_ETHER_ENCAP_H */
|
#endif /* INCLUDED_IEEE802_11_ETHER_ENCAP_H */
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2021 Anton Ottosson.
|
||||||
|
*
|
||||||
|
* This is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this software; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDED_IEEE802_11_EXTRACT_CSI_H
|
||||||
|
#define INCLUDED_IEEE802_11_EXTRACT_CSI_H
|
||||||
|
|
||||||
|
#include <gnuradio/sync_block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace ieee802_11 {
|
||||||
|
|
||||||
|
class IEEE802_11_API extract_csi : virtual public gr::sync_block
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<extract_csi> sptr;
|
||||||
|
static sptr make();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ieee802_11
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_EXTRACT_CSI_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013, 2015 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -13,33 +13,38 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_EQUALIZE_SYMBOLS_H
|
|
||||||
#define INCLUDED_IEEE802_11_OFDM_EQUALIZE_SYMBOLS_H
|
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
|
#ifndef INCLUDED_IEEE802_11_FRAME_EQUALIZER_H
|
||||||
|
#define INCLUDED_IEEE802_11_FRAME_EQUALIZER_H
|
||||||
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
enum Equalizer {
|
enum Equalizer {
|
||||||
LMS = 0,
|
LS = 0,
|
||||||
LINEAR_COMB = 1,
|
LMS = 1,
|
||||||
|
COMB = 2,
|
||||||
|
STA = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_equalize_symbols : virtual public block
|
class IEEE802_11_API frame_equalizer : virtual public gr::block
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<frame_equalizer> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_equalize_symbols> sptr;
|
static sptr make(Equalizer algo, double freq, double bw, bool log, bool debug);
|
||||||
static sptr make(Equalizer algo, bool debug = false);
|
virtual void set_algorithm(Equalizer algo) = 0;
|
||||||
virtual void set_algorithm(Equalizer algo) = 0;
|
virtual void set_bandwidth(double bw) = 0;
|
||||||
|
virtual void set_frequency(double freq) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_EQUALIZE_SYMBOLS_H*/
|
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_FRAME_EQUALIZER_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,26 +14,25 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_MAC_H
|
#ifndef INCLUDED_IEEE802_11_MAC_H
|
||||||
#define INCLUDED_IEEE802_11_OFDM_MAC_H
|
#define INCLUDED_IEEE802_11_MAC_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_mac : virtual public block
|
class IEEE802_11_API mac : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<mac> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_mac> sptr;
|
static sptr make(std::vector<uint8_t> src_mac,
|
||||||
static sptr make(std::vector<uint8_t> src_mac,
|
std::vector<uint8_t> dst_mac,
|
||||||
std::vector<uint8_t> dst_mac,
|
std::vector<uint8_t> bss_mac);
|
||||||
std::vector<uint8_t> bss_mac);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_MAC_H */
|
#endif /* INCLUDED_IEEE802_11_MAC_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,36 +14,35 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_MAPPER_H
|
#ifndef INCLUDED_IEEE802_11_MAPPER_H
|
||||||
#define INCLUDED_IEEE802_11_OFDM_MAPPER_H
|
#define INCLUDED_IEEE802_11_MAPPER_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
enum Encoding {
|
enum Encoding {
|
||||||
BPSK_1_2 = 0,
|
BPSK_1_2 = 0,
|
||||||
BPSK_3_4 = 1,
|
BPSK_3_4 = 1,
|
||||||
QPSK_1_2 = 2,
|
QPSK_1_2 = 2,
|
||||||
QPSK_3_4 = 3,
|
QPSK_3_4 = 3,
|
||||||
QAM16_1_2 = 4,
|
QAM16_1_2 = 4,
|
||||||
QAM16_3_4 = 5,
|
QAM16_3_4 = 5,
|
||||||
QAM64_2_3 = 6,
|
QAM64_2_3 = 6,
|
||||||
QAM64_3_4 = 7,
|
QAM64_3_4 = 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_mapper : virtual public block
|
class IEEE802_11_API mapper : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<mapper> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_mapper> sptr;
|
static sptr make(Encoding mcs, bool debug = false);
|
||||||
static sptr make(Encoding mcs, bool debug = false);
|
virtual void set_encoding(Encoding mcs) = 0;
|
||||||
virtual void set_encoding(Encoding mcs) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_MAPPER_H */
|
#endif /* INCLUDED_IEEE802_11_MAPPER_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,27 +14,23 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_DECODE_MAC_H
|
#ifndef INCLUDED_IEEE802_11_PARSE_MAC_H
|
||||||
#define INCLUDED_IEEE802_11_OFDM_DECODE_MAC_H
|
#define INCLUDED_IEEE802_11_PARSE_MAC_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_decode_mac : virtual public block
|
class IEEE802_11_API parse_mac : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<parse_mac> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_decode_mac> sptr;
|
static sptr make(bool log = false, bool debug = false);
|
||||||
static sptr make(bool log = false, bool debug = false);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_DECODE_MAC_H */
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_PARSE_MAC_H */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -15,27 +15,26 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INCLUDED_IEEE802_11_WIFI_SIGNAL_FIELD_H
|
#ifndef INCLUDED_IEEE802_11_SIGNAL_FIELD_H
|
||||||
#define INCLUDED_IEEE802_11_WIFI_SIGNAL_FIELD_H
|
#define INCLUDED_IEEE802_11_SIGNAL_FIELD_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/digital/packet_header_default.h>
|
#include <gnuradio/digital/packet_header_default.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API wifi_signal_field : virtual public digital::packet_header_default
|
class IEEE802_11_API signal_field : virtual public digital::packet_header_default
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<wifi_signal_field> sptr;
|
typedef boost::shared_ptr<signal_field> sptr;
|
||||||
static sptr make();
|
static sptr make();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wifi_signal_field();
|
signal_field();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_WIFI_SIGNAL_FIELD_H */
|
#endif /* INCLUDED_IEEE802_11_SIGNAL_FIELD_H */
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -14,26 +14,23 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#ifndef INCLUDED_IEEE802_11_OFDM_DECODE_SIGNAL_H
|
#ifndef INCLUDED_IEEE802_11_SYNC_LONG_H
|
||||||
#define INCLUDED_IEEE802_11_OFDM_DECODE_SIGNAL_H
|
#define INCLUDED_IEEE802_11_SYNC_LONG_H
|
||||||
|
|
||||||
#include <ieee802-11/api.h>
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
|
|
||||||
class IEEE802_11_API ofdm_decode_signal : virtual public block
|
class IEEE802_11_API sync_long : virtual public block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef boost::shared_ptr<sync_long> sptr;
|
||||||
typedef boost::shared_ptr<ofdm_decode_signal> sptr;
|
static sptr make(unsigned int sync_length, bool log = false, bool debug = false);
|
||||||
static sptr make(bool log = false, bool debug = false);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ieee802_11
|
} // namespace ieee802_11
|
||||||
} // namespace gr
|
} // namespace gr
|
||||||
|
|
||||||
#endif /* INCLUDED_IEEE802_11_OFDM_DECODE_SIGNAL_H */
|
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_SYNC_LONG_H */
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef INCLUDED_IEEE802_11_SYNC_SHORT_H
|
||||||
|
#define INCLUDED_IEEE802_11_SYNC_SHORT_H
|
||||||
|
|
||||||
|
#include <gnuradio/block.h>
|
||||||
|
#include <ieee802_11/api.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace ieee802_11 {
|
||||||
|
|
||||||
|
class IEEE802_11_API sync_short : virtual public block
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<sync_short> sptr;
|
||||||
|
static sptr make(double threshold,
|
||||||
|
unsigned int min_plateau,
|
||||||
|
bool log = false,
|
||||||
|
bool debug = false);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ieee802_11
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_SYNC_SHORT_H */
|
||||||
+75
-95
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 2013 Bastian Bloessl <bloessl@ccs-labs.org>
|
# Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,114 +19,94 @@
|
|||||||
# Setup library
|
# Setup library
|
||||||
########################################################################
|
########################################################################
|
||||||
include(GrPlatform) #define LIB_SUFFIX
|
include(GrPlatform) #define LIB_SUFFIX
|
||||||
|
check_include_file("xmmintrin.h" SSE2_SUPPORTED)
|
||||||
|
|
||||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py "
|
if(SSE2_SUPPORTED)
|
||||||
#!${PYTHON_EXECUTABLE}
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
|
||||||
|
add_definitions(-DIEEE80211_MSSE2)
|
||||||
import sys, os, re
|
endif(SSE2_SUPPORTED)
|
||||||
sys.path.append('${GR_RUNTIME_PYTHONPATH}')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.path.append('${CMAKE_CURRENT_SOURCE_DIR}/../python')
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_dict(name, sig, 'ieee802_11')
|
|
||||||
build_utils.expand_template(d, inp, '_impl')
|
|
||||||
")
|
|
||||||
|
|
||||||
|
|
||||||
macro(expand_cc_h_impl root)
|
|
||||||
#make a list of all the generated files
|
|
||||||
unset(expanded_files_cc_impl)
|
|
||||||
unset(expanded_files_h_impl)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
|
|
||||||
list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.cc files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_cc_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.cc.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.h files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.cc source files depend on headers to force generation
|
|
||||||
set_source_files_properties(${expanded_files_cc_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.h source files depend on headers to force generation
|
|
||||||
set_source_files_properties(${expanded_files_h_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated cc files
|
|
||||||
list(APPEND generated_sources ${expanded_files_cc_impl})
|
|
||||||
endmacro(expand_cc_h_impl)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Invoke macro to generate various sources
|
|
||||||
########################################################################
|
|
||||||
expand_cc_h_impl(moving_average_XX cc ff)
|
|
||||||
add_custom_target(ieee802_11_generated_sources DEPENDS ${generated_sources})
|
|
||||||
add_dependencies(ieee802_11_generated_sources ieee802_11_generated_includes)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Setup library
|
# Setup library
|
||||||
########################################################################
|
########################################################################
|
||||||
list(APPEND gr_ieee802_11_sources
|
list(APPEND ieee802_11_sources
|
||||||
${generated_sources}
|
|
||||||
equalizer/linear_comb.cc
|
|
||||||
equalizer/lms.cc
|
|
||||||
chunks_to_symbols_impl.cc
|
chunks_to_symbols_impl.cc
|
||||||
|
constellations_impl.cc
|
||||||
|
decode_mac.cc
|
||||||
|
equalizer/base.cc
|
||||||
|
equalizer/comb.cc
|
||||||
|
equalizer/ls.cc
|
||||||
|
equalizer/lms.cc
|
||||||
|
equalizer/sta.cc
|
||||||
ether_encap_impl.cc
|
ether_encap_impl.cc
|
||||||
ofdm_decode_mac.cc
|
extract_csi_impl.cc
|
||||||
ofdm_decode_signal.cc
|
frame_equalizer_impl.cc
|
||||||
ofdm_equalize_symbols.cc
|
mac.cc
|
||||||
ofdm_mac.cc
|
mapper.cc
|
||||||
ofdm_mapper.cc
|
parse_mac.cc
|
||||||
ofdm_parse_mac.cc
|
signal_field_impl.cc
|
||||||
ofdm_sync_long.cc
|
sync_long.cc
|
||||||
ofdm_sync_short.cc
|
sync_short.cc
|
||||||
utils.cc
|
utils.cc
|
||||||
wifi_signal_field_impl.cc
|
viterbi_decoder/base.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND gr_ieee802_11_libs
|
# use SSE2 optimized viterbi implementation if SSE2 is enabled
|
||||||
${Boost_LIBRARIES}
|
if(SSE2_SUPPORTED)
|
||||||
${GNURADIO_ALL_LIBRARIES}
|
list(APPEND ieee802_11_sources
|
||||||
${ITPP_LIBRARIES}
|
viterbi_decoder/viterbi_decoder_x86.cc
|
||||||
${LOG4CPP_LIBRARIES}
|
)
|
||||||
)
|
else()
|
||||||
|
list(APPEND ieee802_11_sources
|
||||||
|
viterbi_decoder/viterbi_decoder_generic.cc
|
||||||
|
)
|
||||||
|
endif(SSE2_SUPPORTED)
|
||||||
|
|
||||||
add_library(gnuradio-ieee802_11 SHARED ${gr_ieee802_11_sources})
|
set(ieee802_11_sources "${ieee802_11_sources}" PARENT_SCOPE)
|
||||||
add_dependencies(gnuradio-ieee802_11 ieee802_11_generated_sources)
|
if(NOT ieee802_11_sources)
|
||||||
target_link_libraries(gnuradio-ieee802_11 ${gr_ieee802_11_libs})
|
MESSAGE(STATUS "No C++ sources... skipping lib/")
|
||||||
|
return()
|
||||||
|
endif(NOT ieee802_11_sources)
|
||||||
|
|
||||||
|
add_library(gnuradio-ieee802_11 SHARED ${ieee802_11_sources})
|
||||||
|
target_link_libraries(gnuradio-ieee802_11
|
||||||
|
gnuradio::gnuradio-runtime
|
||||||
|
gnuradio::gnuradio-filter
|
||||||
|
gnuradio::gnuradio-blocks
|
||||||
|
gnuradio::gnuradio-analog
|
||||||
|
gnuradio::gnuradio-fft
|
||||||
|
gnuradio::gnuradio-digital)
|
||||||
|
target_include_directories(gnuradio-ieee802_11
|
||||||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
|
||||||
|
PUBLIC $<INSTALL_INTERFACE:include>
|
||||||
|
)
|
||||||
set_target_properties(gnuradio-ieee802_11 PROPERTIES DEFINE_SYMBOL "gnuradio_ieee802_11_EXPORTS")
|
set_target_properties(gnuradio-ieee802_11 PROPERTIES DEFINE_SYMBOL "gnuradio_ieee802_11_EXPORTS")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set_target_properties(gnuradio-ieee802_11 PROPERTIES
|
||||||
|
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
|
||||||
|
)
|
||||||
|
endif(APPLE)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install built library files
|
# Install built library files
|
||||||
########################################################################
|
########################################################################
|
||||||
install(TARGETS gnuradio-ieee802_11
|
include(GrMiscUtils)
|
||||||
LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file
|
GR_LIBRARY_FOO(gnuradio-ieee802_11)
|
||||||
ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
|
|
||||||
RUNTIME DESTINATION bin # .dll file
|
########################################################################
|
||||||
|
# Print summary
|
||||||
|
########################################################################
|
||||||
|
message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||||
|
message(STATUS "Building for version: ${VERSION} / ${LIBVER}")
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Build and register unit test
|
||||||
|
########################################################################
|
||||||
|
include(GrTest)
|
||||||
|
|
||||||
|
# If your unit tests require special include paths, add them here
|
||||||
|
#include_directories()
|
||||||
|
# List all files that contain Boost.UTF unit tests here
|
||||||
|
list(APPEND test_ieee802_11_sources
|
||||||
)
|
)
|
||||||
|
|||||||
+54
-101
@@ -22,123 +22,76 @@
|
|||||||
|
|
||||||
using namespace gr::ieee802_11;
|
using namespace gr::ieee802_11;
|
||||||
|
|
||||||
chunks_to_symbols::sptr
|
chunks_to_symbols::sptr chunks_to_symbols::make()
|
||||||
chunks_to_symbols::make()
|
|
||||||
{
|
{
|
||||||
return gnuradio::get_initial_sptr(new chunks_to_symbols_impl());
|
return gnuradio::get_initial_sptr(new chunks_to_symbols_impl());
|
||||||
}
|
}
|
||||||
|
|
||||||
chunks_to_symbols_impl::chunks_to_symbols_impl()
|
chunks_to_symbols_impl::chunks_to_symbols_impl()
|
||||||
: tagged_stream_block("wifi_chunks_to_symbols",
|
: tagged_stream_block("chunks_to_symbols",
|
||||||
io_signature::make(1, 1, sizeof(char)),
|
io_signature::make(1, 1, sizeof(char)),
|
||||||
io_signature::make(1, 1, sizeof(gr_complex)), "packet_len") {
|
io_signature::make(1, 1, sizeof(gr_complex)),
|
||||||
|
"packet_len")
|
||||||
|
{
|
||||||
|
|
||||||
|
d_bpsk = constellation_bpsk::make();
|
||||||
|
d_qpsk = constellation_qpsk::make();
|
||||||
|
d_16qam = constellation_16qam::make();
|
||||||
|
d_64qam = constellation_64qam::make();
|
||||||
|
|
||||||
|
d_mapping = d_bpsk;
|
||||||
}
|
}
|
||||||
|
|
||||||
chunks_to_symbols_impl::~chunks_to_symbols_impl() { }
|
chunks_to_symbols_impl::~chunks_to_symbols_impl() {}
|
||||||
|
|
||||||
|
|
||||||
int
|
int chunks_to_symbols_impl::work(int noutput_items,
|
||||||
chunks_to_symbols_impl::work(int noutput_items,
|
gr_vector_int& ninput_items,
|
||||||
gr_vector_int &ninput_items,
|
gr_vector_const_void_star& input_items,
|
||||||
gr_vector_const_void_star &input_items,
|
gr_vector_void_star& output_items)
|
||||||
gr_vector_void_star &output_items) {
|
{
|
||||||
|
|
||||||
const unsigned char *in = (unsigned char*)input_items[0];
|
const unsigned char* in = (unsigned char*)input_items[0];
|
||||||
gr_complex *out = (gr_complex*)output_items[0];
|
gr_complex* out = (gr_complex*)output_items[0];
|
||||||
|
|
||||||
std::vector<tag_t> tags;
|
std::vector<tag_t> tags;
|
||||||
get_tags_in_range(tags, 0, nitems_read(0),
|
get_tags_in_range(
|
||||||
nitems_read(0) + ninput_items[0],
|
tags, 0, nitems_read(0), nitems_read(0) + ninput_items[0], pmt::mp("encoding"));
|
||||||
pmt::mp("encoding"));
|
if (tags.size() != 1) {
|
||||||
if(tags.size() != 1) {
|
throw std::runtime_error("no encoding in input stream");
|
||||||
throw std::runtime_error("no encoding in input stream");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Encoding encoding = (Encoding)pmt::to_long(tags[0].value);
|
Encoding encoding = (Encoding)pmt::to_long(tags[0].value);
|
||||||
|
|
||||||
const gr_complex *mapping;
|
switch (encoding) {
|
||||||
|
case BPSK_1_2:
|
||||||
|
case BPSK_3_4:
|
||||||
|
d_mapping = d_bpsk;
|
||||||
|
break;
|
||||||
|
|
||||||
switch (encoding) {
|
case QPSK_1_2:
|
||||||
case BPSK_1_2:
|
case QPSK_3_4:
|
||||||
case BPSK_3_4:
|
d_mapping = d_qpsk;
|
||||||
mapping = BPSK;
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case QPSK_1_2:
|
case QAM16_1_2:
|
||||||
case QPSK_3_4:
|
case QAM16_3_4:
|
||||||
mapping = QPSK;
|
d_mapping = d_16qam;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QAM16_1_2:
|
case QAM64_2_3:
|
||||||
case QAM16_3_4:
|
case QAM64_3_4:
|
||||||
mapping = QAM16;
|
d_mapping = d_64qam;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QAM64_2_3:
|
default:
|
||||||
case QAM64_3_4:
|
throw std::invalid_argument("wrong encoding");
|
||||||
mapping = QAM64;
|
break;
|
||||||
break;
|
}
|
||||||
|
|
||||||
default:
|
for (int i = 0; i < ninput_items[0]; i++) {
|
||||||
throw std::invalid_argument("wrong encoding");
|
d_mapping->map_to_points(in[i], out + i);
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 0; i < ninput_items[0]; i++) {
|
return ninput_items[0];
|
||||||
out[i] = mapping[in[i]];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ninput_items[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const gr_complex chunks_to_symbols_impl::BPSK[2] = {
|
|
||||||
gr_complex(-1.0, 0.0), gr_complex(1.0, 0.0)};
|
|
||||||
|
|
||||||
const gr_complex chunks_to_symbols_impl::QPSK[4] = {
|
|
||||||
gr_complex(-0.7071, -0.7071), gr_complex(-0.7071, 0.7071),
|
|
||||||
gr_complex(+0.7071, -0.7071), gr_complex(+0.7071, 0.7071)};
|
|
||||||
|
|
||||||
const gr_complex chunks_to_symbols_impl::QAM16[16] = {
|
|
||||||
gr_complex(-0.9487, -0.9487), gr_complex(-0.9487, -0.3162),
|
|
||||||
gr_complex(-0.9487, 0.9487), gr_complex(-0.9487, 0.3162),
|
|
||||||
gr_complex(-0.3162, -0.9487), gr_complex(-0.3162, -0.3162),
|
|
||||||
gr_complex(-0.3162, 0.9487), gr_complex(-0.3162, 0.3162),
|
|
||||||
gr_complex(0.9487, -0.9487), gr_complex(0.9487, -0.3162),
|
|
||||||
gr_complex(0.9487, 0.9487), gr_complex(0.9487, 0.3162),
|
|
||||||
gr_complex(0.3162, -0.9487), gr_complex(0.3162, -0.3162),
|
|
||||||
gr_complex(0.3162, 0.9487), gr_complex(0.3162, 0.3162)};
|
|
||||||
|
|
||||||
const gr_complex chunks_to_symbols_impl::QAM64[64] = {
|
|
||||||
gr_complex(-1.0801, -1.0801), gr_complex(-1.0801, -0.7715),
|
|
||||||
gr_complex(-1.0801, -0.1543), gr_complex(-1.0801, -0.4629),
|
|
||||||
gr_complex(-1.0801, 1.0801), gr_complex(-1.0801, 0.7715),
|
|
||||||
gr_complex(-1.0801, 0.1543), gr_complex(-1.0801, 0.4629),
|
|
||||||
gr_complex(-0.7715, -1.0801), gr_complex(-0.7715, -0.7715),
|
|
||||||
gr_complex(-0.7715, -0.1543), gr_complex(-0.7715, -0.4629),
|
|
||||||
gr_complex(-0.7715, 1.0801), gr_complex(-0.7715, 0.7715),
|
|
||||||
gr_complex(-0.7715, 0.1543), gr_complex(-0.7715, 0.4629),
|
|
||||||
gr_complex(-0.1543, -1.0801), gr_complex(-0.1543, -0.7715),
|
|
||||||
gr_complex(-0.1543, -0.1543), gr_complex(-0.1543, -0.4629),
|
|
||||||
gr_complex(-0.1543, 1.0801), gr_complex(-0.1543, 0.7715),
|
|
||||||
gr_complex(-0.1543, 0.1543), gr_complex(-0.1543, 0.4629),
|
|
||||||
gr_complex(-0.4629, -1.0801), gr_complex(-0.4629, -0.7715),
|
|
||||||
gr_complex(-0.4629, -0.1543), gr_complex(-0.4629, -0.4629),
|
|
||||||
gr_complex(-0.4629, 1.0801), gr_complex(-0.4629, 0.7715),
|
|
||||||
gr_complex(-0.4629, 0.1543), gr_complex(-0.4629, 0.4629),
|
|
||||||
gr_complex(1.0801, -1.0801), gr_complex(1.0801, -0.7715),
|
|
||||||
gr_complex(1.0801, -0.1543), gr_complex(1.0801, -0.4629),
|
|
||||||
gr_complex(1.0801, 1.0801), gr_complex(1.0801, 0.7715),
|
|
||||||
gr_complex(1.0801, 0.1543), gr_complex(1.0801, 0.4629),
|
|
||||||
gr_complex(0.7715, -1.0801), gr_complex(0.7715, -0.7715),
|
|
||||||
gr_complex(0.7715, -0.1543), gr_complex(0.7715, -0.4629),
|
|
||||||
gr_complex(0.7715, 1.0801), gr_complex(0.7715, 0.7715),
|
|
||||||
gr_complex(0.7715, 0.1543), gr_complex(0.7715, 0.4629),
|
|
||||||
gr_complex(0.1543, -1.0801), gr_complex(0.1543, -0.7715),
|
|
||||||
gr_complex(0.1543, -0.1543), gr_complex(0.1543, -0.4629),
|
|
||||||
gr_complex(0.1543, 1.0801), gr_complex(0.1543, 0.7715),
|
|
||||||
gr_complex(0.1543, 0.1543), gr_complex(0.1543, 0.4629),
|
|
||||||
gr_complex(0.4629, -1.0801), gr_complex(0.4629, -0.7715),
|
|
||||||
gr_complex(0.4629, -0.1543), gr_complex(0.4629, -0.4629),
|
|
||||||
gr_complex(0.4629, 1.0801), gr_complex(0.4629, 0.7715),
|
|
||||||
gr_complex(0.4629, 0.1543), gr_complex(0.4629, 0.4629)};
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
#ifndef INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_IMPL_H
|
#ifndef INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_IMPL_H
|
||||||
#define INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_IMPL_H
|
#define INCLUDED_IEEE802_11_CHUNKS_TO_SYMBOLS_IMPL_H
|
||||||
|
|
||||||
#include <ieee802-11/chunks_to_symbols.h>
|
#include <ieee802_11/chunks_to_symbols.h>
|
||||||
|
#include <ieee802_11/constellations.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
@@ -25,19 +26,20 @@ namespace ieee802_11 {
|
|||||||
class chunks_to_symbols_impl : public chunks_to_symbols
|
class chunks_to_symbols_impl : public chunks_to_symbols
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
chunks_to_symbols_impl();
|
chunks_to_symbols_impl();
|
||||||
~chunks_to_symbols_impl();
|
~chunks_to_symbols_impl();
|
||||||
|
|
||||||
int work(int noutput_items,
|
int work(int noutput_items,
|
||||||
gr_vector_int &ninput_itmes,
|
gr_vector_int& ninput_itmes,
|
||||||
gr_vector_const_void_star &input_items,
|
gr_vector_const_void_star& input_items,
|
||||||
gr_vector_void_star &output_items);
|
gr_vector_void_star& output_items);
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
static const gr_complex BPSK[2];
|
boost::shared_ptr<gr::digital::constellation> d_mapping;
|
||||||
static const gr_complex QPSK[4];
|
constellation_bpsk::sptr d_bpsk;
|
||||||
static const gr_complex QAM16[16];
|
constellation_qpsk::sptr d_qpsk;
|
||||||
static const gr_complex QAM64[64];
|
constellation_16qam::sptr d_16qam;
|
||||||
|
constellation_64qam::sptr d_64qam;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace ieee802_11 */
|
} /* namespace ieee802_11 */
|
||||||
|
|||||||
@@ -0,0 +1,233 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "constellations_impl.h"
|
||||||
|
|
||||||
|
using namespace gr::ieee802_11;
|
||||||
|
|
||||||
|
constellation_bpsk::sptr constellation_bpsk::make()
|
||||||
|
{
|
||||||
|
return constellation_bpsk::sptr(new constellation_bpsk_impl());
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_bpsk::constellation_bpsk() {}
|
||||||
|
|
||||||
|
constellation_bpsk_impl::constellation_bpsk_impl()
|
||||||
|
{
|
||||||
|
d_constellation.resize(2);
|
||||||
|
d_constellation[0] = gr_complex(-1, 0);
|
||||||
|
d_constellation[1] = gr_complex(1, 0);
|
||||||
|
d_rotational_symmetry = 2;
|
||||||
|
d_dimensionality = 1;
|
||||||
|
calc_arity();
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_bpsk_impl::~constellation_bpsk_impl() {}
|
||||||
|
|
||||||
|
unsigned int constellation_bpsk_impl::decision_maker(const gr_complex* sample)
|
||||||
|
{
|
||||||
|
return (real(*sample) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
constellation_qpsk::sptr constellation_qpsk::make()
|
||||||
|
{
|
||||||
|
return constellation_qpsk::sptr(new constellation_qpsk_impl());
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_qpsk::constellation_qpsk() {}
|
||||||
|
|
||||||
|
constellation_qpsk_impl::constellation_qpsk_impl()
|
||||||
|
{
|
||||||
|
const float level = sqrt(float(0.5));
|
||||||
|
d_constellation.resize(4);
|
||||||
|
// Gray-coded
|
||||||
|
d_constellation[0] = gr_complex(-level, -level);
|
||||||
|
d_constellation[1] = gr_complex(level, -level);
|
||||||
|
d_constellation[2] = gr_complex(-level, level);
|
||||||
|
d_constellation[3] = gr_complex(level, level);
|
||||||
|
|
||||||
|
d_rotational_symmetry = 4;
|
||||||
|
d_dimensionality = 1;
|
||||||
|
calc_arity();
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_qpsk_impl::~constellation_qpsk_impl() {}
|
||||||
|
|
||||||
|
unsigned int constellation_qpsk_impl::decision_maker(const gr_complex* sample)
|
||||||
|
{
|
||||||
|
return 2 * (imag(*sample) > 0) + (real(*sample) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
constellation_16qam::sptr constellation_16qam::make()
|
||||||
|
{
|
||||||
|
return constellation_16qam::sptr(new constellation_16qam_impl());
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_16qam::constellation_16qam() {}
|
||||||
|
|
||||||
|
constellation_16qam_impl::constellation_16qam_impl()
|
||||||
|
{
|
||||||
|
const float level = sqrt(float(0.1));
|
||||||
|
d_constellation.resize(16);
|
||||||
|
|
||||||
|
d_constellation[0] = gr_complex(-3 * level, -3 * level);
|
||||||
|
d_constellation[1] = gr_complex(3 * level, -3 * level);
|
||||||
|
d_constellation[2] = gr_complex(-1 * level, -3 * level);
|
||||||
|
d_constellation[3] = gr_complex(1 * level, -3 * level);
|
||||||
|
d_constellation[4] = gr_complex(-3 * level, 3 * level);
|
||||||
|
d_constellation[5] = gr_complex(3 * level, 3 * level);
|
||||||
|
d_constellation[6] = gr_complex(-1 * level, 3 * level);
|
||||||
|
d_constellation[7] = gr_complex(1 * level, 3 * level);
|
||||||
|
d_constellation[8] = gr_complex(-3 * level, -1 * level);
|
||||||
|
d_constellation[9] = gr_complex(3 * level, -1 * level);
|
||||||
|
d_constellation[10] = gr_complex(-1 * level, -1 * level);
|
||||||
|
d_constellation[11] = gr_complex(1 * level, -1 * level);
|
||||||
|
d_constellation[12] = gr_complex(-3 * level, 1 * level);
|
||||||
|
d_constellation[13] = gr_complex(3 * level, 1 * level);
|
||||||
|
d_constellation[14] = gr_complex(-1 * level, 1 * level);
|
||||||
|
d_constellation[15] = gr_complex(1 * level, 1 * level);
|
||||||
|
|
||||||
|
d_rotational_symmetry = 4;
|
||||||
|
d_dimensionality = 1;
|
||||||
|
calc_arity();
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_16qam_impl::~constellation_16qam_impl() {}
|
||||||
|
|
||||||
|
unsigned int constellation_16qam_impl::decision_maker(const gr_complex* sample)
|
||||||
|
{
|
||||||
|
unsigned int ret = 0;
|
||||||
|
const float level = sqrt(float(0.1));
|
||||||
|
float re = sample->real();
|
||||||
|
float im = sample->imag();
|
||||||
|
|
||||||
|
ret |= re > 0;
|
||||||
|
ret |= (std::abs(re) < (2 * level)) << 1;
|
||||||
|
ret |= (im > 0) << 2;
|
||||||
|
ret |= (std::abs(im) < (2 * level)) << 3;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
constellation_64qam::sptr constellation_64qam::make()
|
||||||
|
{
|
||||||
|
return constellation_64qam::sptr(new constellation_64qam_impl());
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_64qam::constellation_64qam() {}
|
||||||
|
|
||||||
|
constellation_64qam_impl::constellation_64qam_impl()
|
||||||
|
{
|
||||||
|
const float level = sqrt(float(1 / 42.0));
|
||||||
|
d_constellation.resize(64);
|
||||||
|
|
||||||
|
d_constellation[0] = gr_complex(-7 * level, -7 * level);
|
||||||
|
d_constellation[1] = gr_complex(7 * level, -7 * level);
|
||||||
|
d_constellation[2] = gr_complex(-1 * level, -7 * level);
|
||||||
|
d_constellation[3] = gr_complex(1 * level, -7 * level);
|
||||||
|
d_constellation[4] = gr_complex(-5 * level, -7 * level);
|
||||||
|
d_constellation[5] = gr_complex(5 * level, -7 * level);
|
||||||
|
d_constellation[6] = gr_complex(-3 * level, -7 * level);
|
||||||
|
d_constellation[7] = gr_complex(3 * level, -7 * level);
|
||||||
|
d_constellation[8] = gr_complex(-7 * level, 7 * level);
|
||||||
|
d_constellation[9] = gr_complex(7 * level, 7 * level);
|
||||||
|
d_constellation[10] = gr_complex(-1 * level, 7 * level);
|
||||||
|
d_constellation[11] = gr_complex(1 * level, 7 * level);
|
||||||
|
d_constellation[12] = gr_complex(-5 * level, 7 * level);
|
||||||
|
d_constellation[13] = gr_complex(5 * level, 7 * level);
|
||||||
|
d_constellation[14] = gr_complex(-3 * level, 7 * level);
|
||||||
|
d_constellation[15] = gr_complex(3 * level, 7 * level);
|
||||||
|
d_constellation[16] = gr_complex(-7 * level, -1 * level);
|
||||||
|
d_constellation[17] = gr_complex(7 * level, -1 * level);
|
||||||
|
d_constellation[18] = gr_complex(-1 * level, -1 * level);
|
||||||
|
d_constellation[19] = gr_complex(1 * level, -1 * level);
|
||||||
|
d_constellation[20] = gr_complex(-5 * level, -1 * level);
|
||||||
|
d_constellation[21] = gr_complex(5 * level, -1 * level);
|
||||||
|
d_constellation[22] = gr_complex(-3 * level, -1 * level);
|
||||||
|
d_constellation[23] = gr_complex(3 * level, -1 * level);
|
||||||
|
d_constellation[24] = gr_complex(-7 * level, 1 * level);
|
||||||
|
d_constellation[25] = gr_complex(7 * level, 1 * level);
|
||||||
|
d_constellation[26] = gr_complex(-1 * level, 1 * level);
|
||||||
|
d_constellation[27] = gr_complex(1 * level, 1 * level);
|
||||||
|
d_constellation[28] = gr_complex(-5 * level, 1 * level);
|
||||||
|
d_constellation[29] = gr_complex(5 * level, 1 * level);
|
||||||
|
d_constellation[30] = gr_complex(-3 * level, 1 * level);
|
||||||
|
d_constellation[31] = gr_complex(3 * level, 1 * level);
|
||||||
|
d_constellation[32] = gr_complex(-7 * level, -5 * level);
|
||||||
|
d_constellation[33] = gr_complex(7 * level, -5 * level);
|
||||||
|
d_constellation[34] = gr_complex(-1 * level, -5 * level);
|
||||||
|
d_constellation[35] = gr_complex(1 * level, -5 * level);
|
||||||
|
d_constellation[36] = gr_complex(-5 * level, -5 * level);
|
||||||
|
d_constellation[37] = gr_complex(5 * level, -5 * level);
|
||||||
|
d_constellation[38] = gr_complex(-3 * level, -5 * level);
|
||||||
|
d_constellation[39] = gr_complex(3 * level, -5 * level);
|
||||||
|
d_constellation[40] = gr_complex(-7 * level, 5 * level);
|
||||||
|
d_constellation[41] = gr_complex(7 * level, 5 * level);
|
||||||
|
d_constellation[42] = gr_complex(-1 * level, 5 * level);
|
||||||
|
d_constellation[43] = gr_complex(1 * level, 5 * level);
|
||||||
|
d_constellation[44] = gr_complex(-5 * level, 5 * level);
|
||||||
|
d_constellation[45] = gr_complex(5 * level, 5 * level);
|
||||||
|
d_constellation[46] = gr_complex(-3 * level, 5 * level);
|
||||||
|
d_constellation[47] = gr_complex(3 * level, 5 * level);
|
||||||
|
d_constellation[48] = gr_complex(-7 * level, -3 * level);
|
||||||
|
d_constellation[49] = gr_complex(7 * level, -3 * level);
|
||||||
|
d_constellation[50] = gr_complex(-1 * level, -3 * level);
|
||||||
|
d_constellation[51] = gr_complex(1 * level, -3 * level);
|
||||||
|
d_constellation[52] = gr_complex(-5 * level, -3 * level);
|
||||||
|
d_constellation[53] = gr_complex(5 * level, -3 * level);
|
||||||
|
d_constellation[54] = gr_complex(-3 * level, -3 * level);
|
||||||
|
d_constellation[55] = gr_complex(3 * level, -3 * level);
|
||||||
|
d_constellation[56] = gr_complex(-7 * level, 3 * level);
|
||||||
|
d_constellation[57] = gr_complex(7 * level, 3 * level);
|
||||||
|
d_constellation[58] = gr_complex(-1 * level, 3 * level);
|
||||||
|
d_constellation[59] = gr_complex(1 * level, 3 * level);
|
||||||
|
d_constellation[60] = gr_complex(-5 * level, 3 * level);
|
||||||
|
d_constellation[61] = gr_complex(5 * level, 3 * level);
|
||||||
|
d_constellation[62] = gr_complex(-3 * level, 3 * level);
|
||||||
|
d_constellation[63] = gr_complex(3 * level, 3 * level);
|
||||||
|
|
||||||
|
d_rotational_symmetry = 4;
|
||||||
|
d_dimensionality = 1;
|
||||||
|
calc_arity();
|
||||||
|
}
|
||||||
|
|
||||||
|
constellation_64qam_impl::~constellation_64qam_impl() {}
|
||||||
|
|
||||||
|
unsigned int constellation_64qam_impl::decision_maker(const gr_complex* sample)
|
||||||
|
{
|
||||||
|
unsigned int ret = 0;
|
||||||
|
const float level = sqrt(float(1 / 42.0));
|
||||||
|
float re = sample->real();
|
||||||
|
float im = sample->imag();
|
||||||
|
|
||||||
|
ret |= re > 0;
|
||||||
|
ret |= (std::abs(re) < (4 * level)) << 1;
|
||||||
|
ret |= (std::abs(re) < (6 * level) && std::abs(re) > (2 * level)) << 2;
|
||||||
|
ret |= (im > 0) << 3;
|
||||||
|
ret |= (std::abs(im) < (4 * level)) << 4;
|
||||||
|
ret |= (std::abs(im) < (6 * level) && std::abs(im) > (2 * level)) << 5;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H
|
||||||
|
#define INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H
|
||||||
|
|
||||||
|
#include <ieee802_11/constellations.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace ieee802_11 {
|
||||||
|
|
||||||
|
class constellation_bpsk_impl : public constellation_bpsk
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constellation_bpsk_impl();
|
||||||
|
~constellation_bpsk_impl();
|
||||||
|
|
||||||
|
unsigned int decision_maker(const gr_complex* sample);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class constellation_qpsk_impl : public constellation_qpsk
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constellation_qpsk_impl();
|
||||||
|
~constellation_qpsk_impl();
|
||||||
|
|
||||||
|
unsigned int decision_maker(const gr_complex* sample);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class constellation_16qam_impl : public constellation_16qam
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constellation_16qam_impl();
|
||||||
|
~constellation_16qam_impl();
|
||||||
|
|
||||||
|
unsigned int decision_maker(const gr_complex* sample);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class constellation_64qam_impl : public constellation_64qam
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constellation_64qam_impl();
|
||||||
|
~constellation_64qam_impl();
|
||||||
|
|
||||||
|
unsigned int decision_maker(const gr_complex* sample);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace ieee802_11
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H */
|
||||||
@@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <ieee802_11/decode_mac.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "viterbi_decoder/viterbi_decoder.h"
|
||||||
|
|
||||||
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <boost/crc.hpp>
|
||||||
|
|
||||||
|
using namespace gr::ieee802_11;
|
||||||
|
|
||||||
|
#define LINKTYPE_IEEE802_11 105 /* http://www.tcpdump.org/linktypes.html */
|
||||||
|
|
||||||
|
class decode_mac_impl : public decode_mac
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
decode_mac_impl(bool log, bool debug)
|
||||||
|
: block("decode_mac",
|
||||||
|
gr::io_signature::make(1, 1, 48),
|
||||||
|
gr::io_signature::make(0, 0, 0)),
|
||||||
|
d_log(log),
|
||||||
|
d_debug(debug),
|
||||||
|
d_ofdm(BPSK_1_2),
|
||||||
|
d_frame(d_ofdm, 0),
|
||||||
|
d_frame_complete(true)
|
||||||
|
{
|
||||||
|
message_port_register_out(pmt::mp("out"));
|
||||||
|
}
|
||||||
|
|
||||||
|
int general_work(int noutput_items,
|
||||||
|
gr_vector_int& ninput_items,
|
||||||
|
gr_vector_const_void_star& input_items,
|
||||||
|
gr_vector_void_star& output_items)
|
||||||
|
{
|
||||||
|
|
||||||
|
const uint8_t* in = (const uint8_t*)input_items[0];
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
std::vector<gr::tag_t> tags;
|
||||||
|
const uint64_t nread = this->nitems_read(0);
|
||||||
|
|
||||||
|
dout << "Decode MAC: input " << ninput_items[0] << std::endl;
|
||||||
|
|
||||||
|
while (i < ninput_items[0]) {
|
||||||
|
|
||||||
|
get_tags_in_range(tags, 0, nread + i, nread + i + 1);
|
||||||
|
|
||||||
|
if (tags.size()) {
|
||||||
|
if (d_frame_complete == false) {
|
||||||
|
dout << "Warning: starting to receive new frame before old frame was "
|
||||||
|
"complete"
|
||||||
|
<< std::endl;
|
||||||
|
dout << "Already copied " << copied << " out of " << d_frame.n_sym
|
||||||
|
<< " symbols of last frame" << std::endl;
|
||||||
|
}
|
||||||
|
d_frame_complete = false;
|
||||||
|
|
||||||
|
// Enter tags into metadata dictionary
|
||||||
|
d_meta = pmt::make_dict();
|
||||||
|
for (auto tag : tags)
|
||||||
|
d_meta = pmt::dict_add(d_meta, tag.key, tag.value);
|
||||||
|
|
||||||
|
int len_data = pmt::to_uint64(pmt::dict_ref(
|
||||||
|
d_meta, pmt::mp("frame bytes"), pmt::from_uint64(MAX_PSDU_SIZE + 1)));
|
||||||
|
int encoding = pmt::to_uint64(
|
||||||
|
pmt::dict_ref(d_meta, pmt::mp("encoding"), pmt::from_uint64(0)));
|
||||||
|
|
||||||
|
ofdm_param ofdm = ofdm_param((Encoding)encoding);
|
||||||
|
frame_param frame = frame_param(ofdm, len_data);
|
||||||
|
|
||||||
|
// check for maximum frame size
|
||||||
|
if (frame.n_sym <= MAX_SYM && frame.psdu_size <= MAX_PSDU_SIZE) {
|
||||||
|
d_ofdm = ofdm;
|
||||||
|
d_frame = frame;
|
||||||
|
copied = 0;
|
||||||
|
dout << "Decode MAC: frame start -- len " << len_data << " symbols "
|
||||||
|
<< frame.n_sym << " encoding " << encoding << std::endl;
|
||||||
|
} else {
|
||||||
|
dout << "Dropping frame which is too large (symbols or bits)"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copied < d_frame.n_sym) {
|
||||||
|
dout << "copy one symbol, copied " << copied << " out of "
|
||||||
|
<< d_frame.n_sym << std::endl;
|
||||||
|
std::memcpy(d_rx_symbols + (copied * 48), in, 48);
|
||||||
|
copied++;
|
||||||
|
|
||||||
|
if (copied == d_frame.n_sym) {
|
||||||
|
dout << "received complete frame - decoding" << std::endl;
|
||||||
|
decode();
|
||||||
|
in += 48;
|
||||||
|
i++;
|
||||||
|
d_frame_complete = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in += 48;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
consume(0, i);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void decode()
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int i = 0; i < d_frame.n_sym * 48; i++) {
|
||||||
|
for (int k = 0; k < d_ofdm.n_bpsc; k++) {
|
||||||
|
d_rx_bits[i * d_ofdm.n_bpsc + k] = !!(d_rx_symbols[i] & (1 << k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deinterleave();
|
||||||
|
uint8_t* decoded = d_decoder.decode(&d_ofdm, &d_frame, d_deinterleaved_bits);
|
||||||
|
descramble(decoded);
|
||||||
|
print_output();
|
||||||
|
|
||||||
|
// skip service field
|
||||||
|
boost::crc_32_type result;
|
||||||
|
result.process_bytes(out_bytes + 2, d_frame.psdu_size);
|
||||||
|
if (result.checksum() != 558161692) {
|
||||||
|
dout << "checksum wrong -- dropping" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mylog(boost::format("encoding: %1% - length: %2% - symbols: %3%") %
|
||||||
|
d_ofdm.encoding % d_frame.psdu_size % d_frame.n_sym);
|
||||||
|
|
||||||
|
// create PDU
|
||||||
|
pmt::pmt_t blob = pmt::make_blob(out_bytes + 2, d_frame.psdu_size - 4);
|
||||||
|
d_meta =
|
||||||
|
pmt::dict_add(d_meta, pmt::mp("dlt"), pmt::from_long(LINKTYPE_IEEE802_11));
|
||||||
|
|
||||||
|
message_port_pub(pmt::mp("out"), pmt::cons(d_meta, blob));
|
||||||
|
}
|
||||||
|
|
||||||
|
void deinterleave()
|
||||||
|
{
|
||||||
|
|
||||||
|
int n_cbps = d_ofdm.n_cbps;
|
||||||
|
int first[n_cbps];
|
||||||
|
int second[n_cbps];
|
||||||
|
int s = std::max(d_ofdm.n_bpsc / 2, 1);
|
||||||
|
|
||||||
|
for (int j = 0; j < n_cbps; j++) {
|
||||||
|
first[j] = s * (j / s) + ((j + int(floor(16.0 * j / n_cbps))) % s);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < n_cbps; i++) {
|
||||||
|
second[i] = 16 * i - (n_cbps - 1) * int(floor(16.0 * i / n_cbps));
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < d_frame.n_sym; i++) {
|
||||||
|
for (int k = 0; k < n_cbps; k++) {
|
||||||
|
d_deinterleaved_bits[i * n_cbps + second[first[k]]] =
|
||||||
|
d_rx_bits[i * n_cbps + k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void descramble(uint8_t* decoded_bits)
|
||||||
|
{
|
||||||
|
|
||||||
|
int state = 0;
|
||||||
|
std::memset(out_bytes, 0, d_frame.psdu_size + 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
if (decoded_bits[i]) {
|
||||||
|
state |= 1 << (6 - i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out_bytes[0] = state;
|
||||||
|
|
||||||
|
int feedback;
|
||||||
|
int bit;
|
||||||
|
|
||||||
|
for (int i = 7; i < d_frame.psdu_size * 8 + 16; i++) {
|
||||||
|
feedback = ((!!(state & 64))) ^ (!!(state & 8));
|
||||||
|
bit = feedback ^ (decoded_bits[i] & 0x1);
|
||||||
|
out_bytes[i / 8] |= bit << (i % 8);
|
||||||
|
state = ((state << 1) & 0x7e) | feedback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_output()
|
||||||
|
{
|
||||||
|
|
||||||
|
dout << std::endl;
|
||||||
|
dout << "psdu size" << d_frame.psdu_size << std::endl;
|
||||||
|
for (int i = 2; i < d_frame.psdu_size + 2; i++) {
|
||||||
|
dout << std::setfill('0') << std::setw(2) << std::hex
|
||||||
|
<< ((unsigned int)out_bytes[i] & 0xFF) << std::dec << " ";
|
||||||
|
if (i % 16 == 15) {
|
||||||
|
dout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dout << std::endl;
|
||||||
|
for (int i = 2; i < d_frame.psdu_size + 2; i++) {
|
||||||
|
if ((out_bytes[i] > 31) && (out_bytes[i] < 127)) {
|
||||||
|
dout << ((char)out_bytes[i]);
|
||||||
|
} else {
|
||||||
|
dout << ".";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool d_debug;
|
||||||
|
bool d_log;
|
||||||
|
|
||||||
|
pmt::pmt_t d_meta;
|
||||||
|
|
||||||
|
frame_param d_frame;
|
||||||
|
ofdm_param d_ofdm;
|
||||||
|
|
||||||
|
viterbi_decoder d_decoder;
|
||||||
|
|
||||||
|
uint8_t d_rx_symbols[48 * MAX_SYM];
|
||||||
|
uint8_t d_rx_bits[MAX_ENCODED_BITS];
|
||||||
|
uint8_t d_deinterleaved_bits[MAX_ENCODED_BITS];
|
||||||
|
uint8_t out_bytes[MAX_PSDU_SIZE + 2]; // 2 for signal field
|
||||||
|
|
||||||
|
int copied;
|
||||||
|
bool d_frame_complete;
|
||||||
|
};
|
||||||
|
|
||||||
|
decode_mac::sptr decode_mac::make(bool log, bool debug)
|
||||||
|
{
|
||||||
|
return gnuradio::get_initial_sptr(new decode_mac_impl(log, debug));
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "base.h"
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace gr::ieee802_11::equalizer;
|
||||||
|
|
||||||
|
const gr_complex base::LONG[] = { 0, 0, 0, 0, 0, 0, 1, 1, -1, -1, 1, 1, -1,
|
||||||
|
1, -1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1,
|
||||||
|
1, -1, 1, 1, 1, 1, 0, 1, -1, -1, 1, 1, -1,
|
||||||
|
1, -1, 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1,
|
||||||
|
-1, 1, -1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
const gr_complex base::POLARITY[127] = {
|
||||||
|
1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1, -1, -1, 1, 1, -1, 1,
|
||||||
|
1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, 1,
|
||||||
|
-1, -1, -1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, -1,
|
||||||
|
1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, 1,
|
||||||
|
1, 1, -1, 1, -1, 1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1,
|
||||||
|
1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<gr_complex> base::get_csi()
|
||||||
|
{
|
||||||
|
std::vector<gr_complex> csi;
|
||||||
|
csi.reserve(52);
|
||||||
|
for (int i = 0; i < 64; i++) {
|
||||||
|
if ((i == 32) || (i < 6) || (i > 58)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
csi.push_back(d_H[i]);
|
||||||
|
}
|
||||||
|
return csi;
|
||||||
|
}
|
||||||
+20
-4
@@ -18,19 +18,35 @@
|
|||||||
#ifndef INCLUDED_IEEE802_11_EQUALIZER_BASE_H
|
#ifndef INCLUDED_IEEE802_11_EQUALIZER_BASE_H
|
||||||
#define INCLUDED_IEEE802_11_EQUALIZER_BASE_H
|
#define INCLUDED_IEEE802_11_EQUALIZER_BASE_H
|
||||||
|
|
||||||
|
#include <gnuradio/digital/constellation.h>
|
||||||
#include <gnuradio/gr_complex.h>
|
#include <gnuradio/gr_complex.h>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
namespace ieee802_11 {
|
namespace ieee802_11 {
|
||||||
namespace equalizer {
|
namespace equalizer {
|
||||||
|
|
||||||
class base {
|
class base
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~base() {};
|
virtual ~base(){};
|
||||||
virtual void equalize(const gr_complex *in, gr_complex *out, int n) = 0;
|
virtual void equalize(gr_complex* in,
|
||||||
|
int n,
|
||||||
|
gr_complex* symbols,
|
||||||
|
uint8_t* bits,
|
||||||
|
boost::shared_ptr<gr::digital::constellation> mod) = 0;
|
||||||
|
virtual double get_snr() = 0;
|
||||||
|
|
||||||
|
static const gr_complex POLARITY[127];
|
||||||
|
|
||||||
|
std::vector<gr_complex> get_csi();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const gr_complex LONG[64];
|
||||||
|
|
||||||
|
gr_complex d_H[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace channel_estimation */
|
} // namespace equalizer
|
||||||
} /* namespace ieee802_11 */
|
} /* namespace ieee802_11 */
|
||||||
} /* namespace gr */
|
} /* namespace gr */
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "comb.h"
|
||||||
|
|
||||||
|
using namespace gr::ieee802_11::equalizer;
|
||||||
|
|
||||||
|
void comb::equalize(gr_complex* in,
|
||||||
|
int n,
|
||||||
|
gr_complex* symbols,
|
||||||
|
uint8_t* bits,
|
||||||
|
boost::shared_ptr<gr::digital::constellation> mod)
|
||||||
|
{
|
||||||
|
|
||||||
|
gr_complex pilot[4];
|
||||||
|
|
||||||
|
if (n < 2) {
|
||||||
|
pilot[0] = in[11];
|
||||||
|
pilot[1] = -in[25];
|
||||||
|
pilot[2] = in[39];
|
||||||
|
pilot[3] = in[53];
|
||||||
|
} else {
|
||||||
|
gr_complex p = POLARITY[(n - 2) % 127];
|
||||||
|
pilot[0] = in[11] * p;
|
||||||
|
pilot[1] = in[25] * p;
|
||||||
|
pilot[2] = in[39] * p;
|
||||||
|
pilot[3] = in[53] * -p;
|
||||||
|
}
|
||||||
|
|
||||||
|
gr_complex avg = (pilot[0] + pilot[1] + pilot[2] + pilot[3]) / gr_complex(4, 0);
|
||||||
|
|
||||||
|
for (int i = 0; i < 64; i++) {
|
||||||
|
gr_complex H;
|
||||||
|
if (i <= 11) {
|
||||||
|
H = gr_complex((11 - i) / 11.0, 0) * avg + gr_complex(i / 11.0, 0) * pilot[0];
|
||||||
|
} else if (i <= 25) {
|
||||||
|
H = gr_complex((25 - i) / 14.0, 0) * pilot[0] +
|
||||||
|
gr_complex((i - 11) / 14.0, 0) * pilot[1];
|
||||||
|
} else if (i <= 39) {
|
||||||
|
H = gr_complex((39 - i) / 14.0, 0) * pilot[1] +
|
||||||
|
gr_complex((i - 25) / 14.0, 0) * pilot[2];
|
||||||
|
} else if (i <= 53) {
|
||||||
|
H = gr_complex((53 - i) / 14.0, 0) * pilot[2] +
|
||||||
|
gr_complex((i - 39) / 14.0, 0) * pilot[3];
|
||||||
|
} else {
|
||||||
|
H = gr_complex((64 - i) / 11.0, 0) * pilot[3] +
|
||||||
|
gr_complex((i - 53) / 11.0, 0) * avg;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n == 0) {
|
||||||
|
d_H[i] = H;
|
||||||
|
} else {
|
||||||
|
d_H[i] = gr_complex(1 - alpha, 0) * d_H[i] + gr_complex(alpha, 0) * H;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
|
for (int i = 0; i < 64; i++) {
|
||||||
|
if ((i == 11) || (i == 25) || (i == 32) || (i == 39) || (i == 53) || (i < 6) ||
|
||||||
|
(i > 58)) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
symbols[c] = in[i] / d_H[i];
|
||||||
|
bits[c] = mod->decision_maker(&symbols[c]);
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double comb::get_snr() { return 42; }
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user