85 Commits

Author SHA1 Message Date
Bastian Bloessl 064f80bb2e Readme: fix git clone links 2023-10-03 12:04:46 +02:00
Itaru OGAWA a1e1f53e41 Fix for insufficient initialization for generic decoder. 2022-09-02 08:39:14 +02:00
Bastian Bloessl 5e02723e67 parse_mac: add missing include 2022-06-07 12:52:53 +02:00
Benjamin Menkuec a0e81851b0 add missing include boost/format.hpp 2022-05-02 19:37:16 +02:00
Bastian Bloessl 0c0fca8ec9 decode_mac: add include 2021-11-24 17:47:04 +01:00
Bastian Bloessl dec30cbed4 chunks_to_symbols: remove unused include 2021-11-24 17:25:12 +01:00
Bastian Bloessl c19b0ad2b5 Merge branch 'maint-3.8' into maint-3.9 2021-08-05 16:30:57 +02:00
Anton Ottosson ef5fd6c595 Fix format_mac_address function in parse_mac.cc
Apparently the stream manipulator `std::setw` applies only to the next string written to the stream. Hence the function `format_mac_address` in parse_mac.cc only formatted the first pair of hexadecimal digits correctly. This went unnoticed until now because it only makes a difference for numbers below 0x10.
2021-08-03 17:35:32 +02:00
Bastian Bloessl cba532a33f Merge branch 'maint-3.8' into maint-3.9 2021-07-20 12:19:14 +02:00
Bastian Bloessl 586ba0a85e update flowgraphs 2021-07-20 12:19:04 +02:00
Bastian Bloessl ef14207914 fix python bindings 2021-07-20 12:19:04 +02:00
Bastian Bloessl 983bf13b7f update flowgraphs 2021-07-20 12:19:04 +02:00
Bastian Bloessl afe85e2c71 python bindings 2021-07-20 12:19:04 +02:00
Bastian Bloessl cd0bb1fafd start porting to 3.9 2021-07-20 12:19:04 +02:00
Bastian Bloessl 6b5a8c1ddc update readme 2021-07-20 12:18:16 +02:00
Bastian Bloessl 4d1befbc05 fix formatting 2021-07-19 08:50:53 +02:00
Anton Ottosson 24f72aaf08 Uniform metadata keys.
This commit makes all metadata keys follow similar formatting: all lowercase, with spaces (as opposed to underlines or other conventions).
2021-07-19 08:14:08 +02:00
Anton Ottosson e620d48c81 Make metadata pipeline more uniform and GR-like.
The Frame Equalizer used to propagate metadata as a dictionary stored in a single tag. Now it instead propagates each entry as a separate tag, which is more in line with how standard GNU Radio blocks do it (see for example PDU to Tagged Stream block). This is also how the Extract CSI block does it.

This modification also removes a lot of unnecessary variables and type conversions (from and to pmt types) in the Decode MAC block.
2021-07-19 08:14:08 +02:00
Anton Ottosson 4f069d6518 Enable debug on Parse MAC in loopback example.
The readme says that if you run the loopback example, then "If everything works as intended you should see some decoded packets on the console". For this to be true out of the box, the debug option on the Parse MAC block must be enabled.
2021-07-19 08:10:13 +02:00
Bastian Bloessl 3d8a172acc delete unused file 2021-07-17 10:10:46 +02:00
Bastian Bloessl a2491b5474 clang format, similar to GNU Radio 2021-07-17 10:07:21 +02:00
Bastian Bloessl 5f7e102e3d cs: coding style 2021-07-17 09:55:17 +02:00
Bastian Bloessl 6cd3b5bd10 update flowgraphs 2021-07-17 09:51:07 +02:00
Bastian Bloessl 4d12149cfb grc: rename CSI block 2021-07-17 09:50:59 +02:00
Anton Ottosson 7e3107282a Added Extract CSI block.
This block takes PDU messages as input, looks for a "csi" entry in the meta dictionary, and if found outputs a complex CSI vector on a stream output. The meta is also sent along as stream tags.
2021-07-14 19:34:12 +02:00
Anton Ottosson 51f7d6b284 Changes in response to discussion with bastibl.
We will not parse the frame body and put it in the metadata. Instead `print_ascii` has been restored for debug output. `format_mac` has been made more complete, with correct hex formatting.
2021-07-13 22:02:43 +02:00
Anton Ottosson 45fd47b6ec Small fix to last commit
If we cannot determine the length of the mac frame body, we should probably not attempt to parse it.
2021-07-13 02:58:23 +02:00
Anton Ottosson 844424404d Parse MAC writes to meta and propagates PDU.
This commit extends the Parse MAC block so that it puts the parsed fields in the metadata dictionary of the incoming PDU and also propagates it on a message output. It does not modify the cdr of the PDU. The 'fer' output has been removed, and instead 'Lost frames' and 'Instantanteous FER' are put in the metadata dictionary.
2021-07-13 02:47:44 +02:00
Anton Ottosson 228d1b1bcc Add beta and csi to decode_mac PDU output.
Also changed to using `std::vector<gr_complex>` type because it was becoming more and more inconvenient to use c-style arrays.
2021-07-09 21:54:38 +02:00
Anton Ottosson 4a3f387d6d Skip guard bands and null subcarrier in get_csi(). Add beta and csi metadata to stream tag from frame equalizer. 2021-07-09 19:34:29 +02:00
Anton Ottosson 0b095e0ff7 Add base::get_csi() to expose d_H. 2021-07-08 23:39:52 +02:00
Anton Ottosson 8ca5dcedde Make d_H inherited from base class.
All equalizer classes had their own private `d_H` vector, despite all being derived from a common `base` class. Now `d_H` is instead a protected member of `base`, and thus accessible to the derived equalizer classes.
2021-07-08 21:51:53 +02:00
Bastian Bloessl d8f45138a2 readme update 2021-07-05 19:41:47 +02:00
Bastian Bloessl e2a59771ed tx flowgraph add hackrf sink 2021-02-03 20:56:21 +01:00
Marcin Borawski 002df040ff Update README.md
Added table of contents and updated the outdated link to Logging docs for GNU Radio.
See #239 .
2020-10-22 15:32:33 +02:00
Bastian Bloessl 0f659b4d50 boost 1.73 fix 2020-08-12 11:49:06 +02:00
Bastian Bloessl ae1286a727 Merge pull request #232 from mychele/maint-3.8
Fixes #231
2020-07-30 09:12:58 +02:00
mychele 7a2cbdb8d8 Fix d_prev_pilots for symbols 0 and 1 in frame_equalizer_impl.cc 2020-07-29 09:42:55 -07:00
Bastian Bloessl d63adab8f1 wifi_tx: disable receive chain 2020-05-31 17:14:09 +02:00
Bastian Bloessl 99f1a4564f cmake: fix sse2 detection 2019-12-17 18:12:36 +01:00
Bastian Bloessl c3e8688859 rename includes to match GR naming scheme 2019-12-17 18:12:31 +01:00
Bastian Bloessl 4f034c9722 cmake: adapt versioning to gr 3.8 2019-08-26 13:24:37 +02:00
Bastian Bloessl 763d55d9f2 new GRC port naming scheme broke flow graphs 2019-07-02 10:09:17 +02:00
Bastian Bloessl a17bd7bf3a update python imports 2019-06-06 17:50:33 +02:00
Bastian Bloessl f66f1eea8a delete obsolete blocks 2019-06-06 13:05:02 +02:00
Bastian Bloessl 14d8dfcb5d cmake: fix include dir name 2019-06-06 12:46:37 +02:00
Bastian Bloessl eea1ffa3bc update readme 2019-06-06 12:11:42 +02:00
Bastian Bloessl 30be96a165 udpate flowgraphs
sorry, new GRC layout is horrible
2019-06-06 12:03:57 +02:00
Bastian Bloessl 9393abbf65 port to 3.8 2019-06-06 12:03:43 +02:00
Bastian Bloessl 39861c37af begin 3.8 porting 2019-03-18 05:58:00 +00:00
Bastian Bloessl 8bffcf7faf update flow graphs (broken) 2018-10-04 14:10:06 +02:00
Bastian Bloessl 358bb5ccaa python: explicit relative imports 2018-10-04 11:28:05 +02:00
Bastian Bloessl fee31310e5 gnuradio does not export python3 version 2018-10-04 11:04:52 +02:00
Bastian Bloessl c80340df6e cmake cleanup 2018-10-04 11:04:39 +02:00
Bastian Bloessl 5c7879feaf del cpp unit 2018-10-04 11:03:59 +02:00
Bastian Bloessl 4555253ab9 delete local modules 2018-10-04 11:03:20 +02:00
Bastian Bloessl 3ccf528a96 del python workaround 2018-10-04 11:03:00 +02:00
Bastian Bloessl b8b91a0c88 update cmake modules 2018-10-04 10:10:45 +02:00
Bastian Bloessl f956d36ce4 del python build utils 2018-10-04 10:08:30 +02:00
Bastian Bloessl 3143469287 convert xml -> yaml 2018-10-04 10:07:53 +02:00
Bastian Bloessl 4cddc2b740 no custom moving avg 2018-10-04 10:06:47 +02:00
Bastian Bloessl d730126586 log4cpp now mandatory 2018-10-04 10:04:50 +02:00
Bastian Bloessl b83d008fc8 Merge branch 'master' into next 2018-04-10 17:48:07 +01:00
Bastian Bloessl 5827b77c19 Merge branch 'master' into next 2018-03-31 12:11:22 +01:00
Bastian Bloessl e07d85547d Merge branch 'master' into next 2017-11-15 13:59:04 +00:00
Bastian Bloessl 333999630d Merge branch 'master' into next 2017-10-24 13:28:28 +02:00
Bastian Bloessl 1624842801 interfernce simulation 2017-10-12 16:24:54 +01:00
Bastian Bloessl 872b2dd0af python frame utilities 2017-10-12 16:24:45 +01:00
Bastian Bloessl df0d480c59 Merge branch 'master' into next 2017-08-09 22:38:55 +01:00
Bastian Bloessl fc429e7f17 Merge branch 'master' into next 2017-04-09 16:42:21 +02:00
Bastian Bloessl d1667da2d4 Merge branch 'master' into next
# Conflicts:
#	CMakeLists.txt
2017-03-17 15:16:32 +01:00
Bastian Bloessl 7b119ba59e Merge branch 'master' into next 2017-03-06 12:49:53 +01:00
Bastian Bloessl 144cbbf796 Merge branch 'master' into next 2017-02-22 17:12:11 +01:00
Bastian Bloessl 429647eff1 loopback: gui hints 2017-01-08 13:56:46 +01:00
Bastian Bloessl 1dcdcce729 Merge pull request #49 from swolfe0105/non-x86-support
non-x86 support: Only use SSE2 when supported
2016-11-11 13:55:34 +01:00
Stephen Wolfe 528536e3f2 viterbi decoder: add viterbi decoder base class
Add a viterbi decoder base class that viterbi decoder
implementations can inherit from.
2016-11-07 15:00:30 -05:00
Stephen Wolfe 9cf628359b viterbi decoder: separate viterbi implementations
reorganizes viterbi decoder source so that each implementation
resides in a separate file.
2016-11-04 14:57:32 -04:00
Stephen Wolfe c6502ae022 non-x86 support: Only use SSE2 when supported
Add generic version of viterbi decoder that does not utilize x86
intrinsics to provide support for other architectures such as ARM.
2016-11-03 11:32:02 -04:00
Bastian Bloessl d96ffc6ec8 Merge branch 'master' into next 2016-10-11 14:38:51 +02:00
Bastian Bloessl 22f761d7d0 Merge branch 'master' into next 2016-09-29 13:14:37 +02:00
Bastian Bloessl 65ec683d8e Merge branch 'master' into next 2016-09-21 12:03:02 +02:00
Bastian Bloessl 5bed2d13e6 Merge branch 'master' into next 2016-09-21 10:12:43 +02:00
Bastian Bloessl 1ef58db9c6 Merge branch 'master' into next
# Conflicts:
#	lib/utils.h
2016-09-20 14:35:34 +02:00
Bastian Bloessl 6f5faecabd Merge branch 'master' into next 2016-09-15 11:38:19 +02:00
Bastian Bloessl c1d50c7ff2 log4cpp is mandatory for GNU Radio 2016-09-15 11:01:13 +02:00
180 changed files with 15208 additions and 25233 deletions
+104
View File
@@ -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
-13
View File
@@ -1,13 +0,0 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
[Makefile]
indent_style = tab
[**.{cc,h,xml}]
indent_style = tab
indent_size = 4
+5 -2
View File
@@ -1,9 +1,12 @@
build
examples/*.py examples/*.py
.cproject .cproject
.project .project
.pydevproject .pydevproject
.settings .settings
*.pyc
**/.DS_Store **/.DS_Store
.clang_complete .clang_complete
*~
*.pyc
*.pyo
build*/
examples/grc/*.py
+90 -95
View File
@@ -1,112 +1,96 @@
# Copyright 2011-2020 Free Software Foundation, Inc.
# #
# Copyright 2013 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
# #
# This program is free software: you can redistribute it and/or modify # SPDX-License-Identifier: GPL-3.0-or-later
# 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/>.
# #
######################################################################## ########################################################################
# 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)
add_definitions(-msse2)
endif() endif()
######################################################################## IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# Find boost SET(CMAKE_CXX_STANDARD 14)
######################################################################## ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
if(UNIX AND EXISTS "/usr/lib64") SET(CMAKE_CXX_STANDARD 14)
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 14)
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
######################################################################## ########################################################################
include(FindPkgConfig)
find_package(Volk)
find_package(Gnuradio "3.9" 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)
if(NOT GNURADIO_RUNTIME_FOUND)
message(FATAL_ERROR "GNU Radio required to compile gr-ieee802-11")
endif()
find_package(CppUnit)
if(NOT CPPUNIT_FOUND)
message(FATAL_ERROR "CppUnit required to compile gr-ieee802-11")
endif()
find_package(Log4cpp)
if (LOG4CPP_FOUND)
message(STATUS "Found LOG4CPP: ${LOG4CPP_LIBRARIES}")
add_definitions("-DGR_IEEE80211_LOG4CPP")
else ()
message(STATUS "LOG4CPP not found (not required).")
endif ()
find_package(SWIG)
if(NOT SWIG_FOUND)
message(FATAL_ERROR "SWIG required to compile gr-ieee802-11")
endif()
find_package(Doxygen)
######################################################################## ########################################################################
# 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
######################################################################## ########################################################################
@@ -117,7 +101,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)
@@ -128,22 +112,18 @@ if(APPLE)
endif(APPLE) endif(APPLE)
######################################################################## ########################################################################
# Setup the include and linker paths # Find gnuradio build dependencies
######################################################################## ########################################################################
include_directories( find_package(Doxygen)
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/lib
${CMAKE_BINARY_DIR}/include
${Boost_INCLUDE_DIRS}
${CPPUNIT_INCLUDE_DIRS}
${GNURADIO_RUNTIME_INCLUDE_DIRS}
)
link_directories( ########################################################################
${Boost_LIBRARY_DIRS} # Setup doxygen option
${CPPUNIT_LIBRARY_DIRS} ########################################################################
${GNURADIO_RUNTIME_LIBRARY_DIRS} if(DOXYGEN_FOUND)
) option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
else(DOXYGEN_FOUND)
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
endif(DOXYGEN_FOUND)
######################################################################## ########################################################################
# Create uninstall target # Create uninstall target
@@ -155,13 +135,28 @@ 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(apps)
add_subdirectory(python) add_subdirectory(docs)
add_subdirectory(grc) # NOTE: manually update below to use GRC to generate C++ flowgraphs w/o python
if(ENABLE_PYTHON)
message(STATUS "PYTHON and GRC components are enabled")
add_subdirectory(python)
add_subdirectory(grc)
else(ENABLE_PYTHON)
message(STATUS "PYTHON and GRC components are disabled")
endif(ENABLE_PYTHON)
########################################################################
# Install cmake search helper for this library
########################################################################
install(FILES cmake/Modules/ieee802_11Config.cmake
DESTINATION ${CMAKE_MODULES_DIR}/ieee802_11
)
+7 -8
View File
@@ -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.
+99 -77
View File
@@ -1,39 +1,36 @@
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. 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 # Development
Like GNU Radio, this module uses *master* and *next* branches for development, which are supposed to be used with the corresponding GNU Radio branches. Like GNU Radio, this module uses *maint* branches for development.
I recommend staying up-to-date by using the *next* branch. 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.
# 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.
### Swig ### GNU Radio
Swig is required to create the python bindings.
sudo apt-get install swig
sudo port install swig
### 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
@@ -44,9 +41,12 @@ There are several ways to install GNU Radio. You can use
### 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
@@ -60,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
@@ -70,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/manual/page_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 your 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 'Hello World' packets in 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 packets on 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
@@ -125,72 +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. - 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)
+14
View File
@@ -0,0 +1,14 @@
# 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
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
include(GrPython)
GR_PYTHON_INSTALL(
PROGRAMS
DESTINATION bin
)
+1 -1
View File
@@ -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>
-39
View File
@@ -1,39 +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}
${CMAKE_INSTALL_PREFIX}/include
PATHS
/usr/local/include
/usr/include
)
FIND_LIBRARY(CPPUNIT_LIBRARIES
NAMES cppunit
HINTS ${PC_CPPUNIT_LIBDIR}
${CMAKE_INSTALL_PREFIX}/lib
${CMAKE_INSTALL_PREFIX}/lib64
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)
-36
View File
@@ -1,36 +0,0 @@
INCLUDE(FindPkgConfig)
PKG_CHECK_MODULES(PC_GNURADIO_RUNTIME gnuradio-runtime)
if(PC_GNURADIO_RUNTIME_FOUND)
# look for include files
FIND_PATH(
GNURADIO_RUNTIME_INCLUDE_DIRS
NAMES gnuradio/top_block.h
HINTS $ENV{GNURADIO_RUNTIME_DIR}/include
${PC_GNURADIO_RUNTIME_INCLUDE_DIRS}
${CMAKE_INSTALL_PREFIX}/include
PATHS /usr/local/include
/usr/include
)
# look for libs
FIND_LIBRARY(
GNURADIO_RUNTIME_LIBRARIES
NAMES gnuradio-runtime
HINTS $ENV{GNURADIO_RUNTIME_DIR}/lib
${PC_GNURADIO_RUNTIME_LIBDIR}
${CMAKE_INSTALL_PREFIX}/lib/
${CMAKE_INSTALL_PREFIX}/lib64/
PATHS /usr/local/lib
/usr/local/lib64
/usr/lib
/usr/lib64
)
set(GNURADIO_RUNTIME_FOUND ${PC_GNURADIO_RUNTIME_FOUND})
endif(PC_GNURADIO_RUNTIME_FOUND)
INCLUDE(FindPackageHandleStandardArgs)
# do not check GNURADIO_RUNTIME_INCLUDE_DIRS, is not set when default include path us used.
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_RUNTIME DEFAULT_MSG GNURADIO_RUNTIME_LIBRARIES)
MARK_AS_ADVANCED(GNURADIO_RUNTIME_LIBRARIES GNURADIO_RUNTIME_INCLUDE_DIRS)
-53
View File
@@ -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
)
-114
View File
@@ -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)
-525
View File
@@ -1,525 +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})
if(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
STRING(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_dup)
if(${flag_dup} EQUAL -1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
endif(${flag_dup} EQUAL -1)
endif(${CMAKE_VERSION} VERSION_GREATER "2.8.4")
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)
-54
View File
@@ -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(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/debian_version")
set(DEBIAN TRUE)
endif()
if(NOT CMAKE_CROSSCOMPILING AND LINUX AND EXISTS "/etc/redhat-release")
set(REDHAT TRUE)
endif()
if(NOT CMAKE_CROSSCOMPILING AND 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")
-241
View File
@@ -1,241 +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
"import re; R=re.compile('^\#!.*$\\n',flags=re.MULTILINE); open('${pyexefile}','w').write('\#!${pyexe_native}\\n'+R.sub('',open('${pyfile}','r').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)
")
-251
View File
@@ -1,251 +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})
if(${name} STREQUAL "runtime_swig")
SET_TARGET_PROPERTIES(${SWIG_MODULE_runtime_swig_REAL_NAME} PROPERTIES DEFINE_SYMBOL "gnuradio_runtime_EXPORTS")
endif(${name} STREQUAL "runtime_swig")
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)))
")
-143
View File
@@ -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)
-82
View File
@@ -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()
-304
View File
@@ -1,304 +0,0 @@
# - SWIG module for CMake
# Defines the following macros:
# SWIG_ADD_MODULE(name language [ files ])
# - Define swig module with given name and specified language
# SWIG_LINK_LIBRARIES(name [ libraries ])
# - Link libraries to swig module
# All other macros are for internal use only.
# To get the actual name of the swig module,
# use: ${SWIG_MODULE_${name}_REAL_NAME}.
# Set Source files properties such as CPLUSPLUS and SWIG_FLAGS to specify
# special behavior of SWIG. Also global CMAKE_SWIG_FLAGS can be used to add
# special flags to all swig calls.
# Another special variable is CMAKE_SWIG_OUTDIR, it allows one to specify
# where to write all the swig generated module (swig -outdir option)
# The name-specific variable SWIG_MODULE_<name>_EXTRA_DEPS may be used
# to specify extra dependencies for the generated modules.
# If the source file generated by swig need some special flag you can use
# set_source_files_properties( ${swig_generated_file_fullname}
# PROPERTIES COMPILE_FLAGS "-bla")
#=============================================================================
# Copyright 2004-2009 Kitware, Inc.
# Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
set(SWIG_CXX_EXTENSION "cxx")
set(SWIG_EXTRA_LIBRARIES "")
set(SWIG_PYTHON_EXTRA_FILE_EXTENSION "py")
#
# For given swig module initialize variables associated with it
#
macro(SWIG_MODULE_INITIALIZE name language)
string(TOUPPER "${language}" swig_uppercase_language)
string(TOLOWER "${language}" swig_lowercase_language)
set(SWIG_MODULE_${name}_LANGUAGE "${swig_uppercase_language}")
set(SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG "${swig_lowercase_language}")
set(SWIG_MODULE_${name}_REAL_NAME "${name}")
if("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "UNKNOWN")
message(FATAL_ERROR "SWIG Error: Language \"${language}\" not found")
elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PYTHON")
# when swig is used without the -interface it will produce in the module.py
# a 'import _modulename' statement, which implies having a corresponding
# _modulename.so (*NIX), _modulename.pyd (Win32).
set(SWIG_MODULE_${name}_REAL_NAME "_${name}")
elseif("${SWIG_MODULE_${name}_LANGUAGE}" STREQUAL "PERL")
set(SWIG_MODULE_${name}_EXTRA_FLAGS "-shadow")
endif()
endmacro()
#
# For a given language, input file, and output file, determine extra files that
# will be generated. This is internal swig macro.
#
macro(SWIG_GET_EXTRA_OUTPUT_FILES language outfiles generatedpath infile)
set(${outfiles} "")
get_source_file_property(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename
${infile} SWIG_MODULE_NAME)
if(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename STREQUAL "NOTFOUND")
get_filename_component(SWIG_GET_EXTRA_OUTPUT_FILES_module_basename "${infile}" NAME_WE)
endif()
foreach(it ${SWIG_${language}_EXTRA_FILE_EXTENSION})
set(${outfiles} ${${outfiles}}
"${generatedpath}/${SWIG_GET_EXTRA_OUTPUT_FILES_module_basename}.${it}")
endforeach()
endmacro()
#
# Take swig (*.i) file and add proper custom commands for it
#
macro(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)
set(swig_full_infile ${infile})
get_filename_component(swig_source_file_path "${infile}" PATH)
get_filename_component(swig_source_file_name_we "${infile}" NAME_WE)
get_source_file_property(swig_source_file_generated ${infile} GENERATED)
get_source_file_property(swig_source_file_cplusplus ${infile} CPLUSPLUS)
get_source_file_property(swig_source_file_flags ${infile} SWIG_FLAGS)
if("${swig_source_file_flags}" STREQUAL "NOTFOUND")
set(swig_source_file_flags "")
endif()
set(swig_source_file_fullname "${infile}")
if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_SOURCE_DIR}")
string(REGEX REPLACE
"^${CMAKE_CURRENT_SOURCE_DIR}" ""
swig_source_file_relative_path
"${swig_source_file_path}")
else()
if(${swig_source_file_path} MATCHES "^${CMAKE_CURRENT_BINARY_DIR}")
string(REGEX REPLACE
"^${CMAKE_CURRENT_BINARY_DIR}" ""
swig_source_file_relative_path
"${swig_source_file_path}")
set(swig_source_file_generated 1)
else()
set(swig_source_file_relative_path "${swig_source_file_path}")
if(swig_source_file_generated)
set(swig_source_file_fullname "${CMAKE_CURRENT_BINARY_DIR}/${infile}")
else()
set(swig_source_file_fullname "${CMAKE_CURRENT_SOURCE_DIR}/${infile}")
endif()
endif()
endif()
set(swig_generated_file_fullname
"${CMAKE_CURRENT_BINARY_DIR}")
if(swig_source_file_relative_path)
set(swig_generated_file_fullname
"${swig_generated_file_fullname}/${swig_source_file_relative_path}")
endif()
# If CMAKE_SWIG_OUTDIR was specified then pass it to -outdir
if(CMAKE_SWIG_OUTDIR)
set(swig_outdir ${CMAKE_SWIG_OUTDIR})
else()
set(swig_outdir ${CMAKE_CURRENT_BINARY_DIR})
endif()
SWIG_GET_EXTRA_OUTPUT_FILES(${SWIG_MODULE_${name}_LANGUAGE}
swig_extra_generated_files
"${swig_outdir}"
"${infile}")
set(swig_generated_file_fullname
"${swig_generated_file_fullname}/${swig_source_file_name_we}")
# add the language into the name of the file (i.e. TCL_wrap)
# this allows for the same .i file to be wrapped into different languages
set(swig_generated_file_fullname
"${swig_generated_file_fullname}${SWIG_MODULE_${name}_LANGUAGE}_wrap")
if(swig_source_file_cplusplus)
set(swig_generated_file_fullname
"${swig_generated_file_fullname}.${SWIG_CXX_EXTENSION}")
else()
set(swig_generated_file_fullname
"${swig_generated_file_fullname}.c")
endif()
# Shut up some warnings from poor SWIG code generation that we
# can do nothing about, when this flag is available
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-Wno-unused-but-set-variable" HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
if(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
set_source_files_properties(${swig_generated_file_fullname}
PROPERTIES COMPILE_FLAGS "-Wno-unused-but-set-variable")
endif(HAVE_WNO_UNUSED_BUT_SET_VARIABLE)
get_directory_property(cmake_include_directories INCLUDE_DIRECTORIES)
set(swig_include_dirs)
foreach(it ${cmake_include_directories})
set(swig_include_dirs ${swig_include_dirs} "-I${it}")
endforeach()
set(swig_special_flags)
# default is c, so add c++ flag if it is c++
if(swig_source_file_cplusplus)
set(swig_special_flags ${swig_special_flags} "-c++")
endif()
set(swig_extra_flags)
if(SWIG_MODULE_${name}_EXTRA_FLAGS)
set(swig_extra_flags ${swig_extra_flags} ${SWIG_MODULE_${name}_EXTRA_FLAGS})
endif()
# hack to work around CMake bug in add_custom_command with multiple OUTPUT files
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', '_', '${name} ${reldir} ' + unique))"
OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE
)
file(
WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
"int main(void){return 0;}\n"
)
# create dummy dependencies
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp.in
${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp
DEPENDS "${swig_source_file_fullname}" ${SWIG_MODULE_${name}_EXTRA_DEPS}
COMMENT ""
)
# create the dummy target
add_executable(${_target} ${CMAKE_CURRENT_BINARY_DIR}/${_target}.cpp)
# add a custom command to the dummy target
add_custom_command(
TARGET ${_target}
# Let's create the ${swig_outdir} at execution time, in case dir contains $(OutDir)
COMMAND ${CMAKE_COMMAND} -E make_directory ${swig_outdir}
COMMAND "${SWIG_EXECUTABLE}"
ARGS "-${SWIG_MODULE_${name}_SWIG_LANGUAGE_FLAG}"
${swig_source_file_flags}
${CMAKE_SWIG_FLAGS}
-outdir ${swig_outdir}
${swig_special_flags}
${swig_extra_flags}
${swig_include_dirs}
-o "${swig_generated_file_fullname}"
"${swig_source_file_fullname}"
COMMENT "Swig source"
)
#add dummy independent dependencies from the _target to each file
#that will be generated by the SWIG command above
set(${outfiles} "${swig_generated_file_fullname}" ${swig_extra_generated_files})
foreach(swig_gen_file ${${outfiles}})
add_custom_command(
OUTPUT ${swig_gen_file}
COMMAND ""
DEPENDS ${_target}
COMMENT ""
)
endforeach()
set_source_files_properties(
${outfiles} PROPERTIES GENERATED 1
)
endmacro()
#
# Create Swig module
#
macro(SWIG_ADD_MODULE name language)
SWIG_MODULE_INITIALIZE(${name} ${language})
set(swig_dot_i_sources)
set(swig_other_sources)
foreach(it ${ARGN})
if(${it} MATCHES ".*\\.i$")
set(swig_dot_i_sources ${swig_dot_i_sources} "${it}")
else()
set(swig_other_sources ${swig_other_sources} "${it}")
endif()
endforeach()
set(swig_generated_sources)
foreach(it ${swig_dot_i_sources})
SWIG_ADD_SOURCE_TO_MODULE(${name} swig_generated_source ${it})
set(swig_generated_sources ${swig_generated_sources} "${swig_generated_source}")
endforeach()
get_directory_property(swig_extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES)
set_directory_properties(PROPERTIES
ADDITIONAL_MAKE_CLEAN_FILES "${swig_extra_clean_files};${swig_generated_sources}")
add_library(${SWIG_MODULE_${name}_REAL_NAME}
MODULE
${swig_generated_sources}
${swig_other_sources})
string(TOLOWER "${language}" swig_lowercase_language)
if ("${swig_lowercase_language}" STREQUAL "java")
if (APPLE)
# In java you want:
# System.loadLibrary("LIBRARY");
# then JNI will look for a library whose name is platform dependent, namely
# MacOS : libLIBRARY.jnilib
# Windows: LIBRARY.dll
# Linux : libLIBRARY.so
set_target_properties (${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".jnilib")
endif ()
endif ()
if ("${swig_lowercase_language}" STREQUAL "python")
# this is only needed for the python case where a _modulename.so is generated
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES PREFIX "")
# Python extension modules on Windows must have the extension ".pyd"
# instead of ".dll" as of Python 2.5. Older python versions do support
# this suffix.
# http://docs.python.org/whatsnew/ports.html#SECTION0001510000000000000000
# <quote>
# Windows: .dll is no longer supported as a filename extension for extension modules.
# .pyd is now the only filename extension that will be searched for.
# </quote>
if(WIN32 AND NOT CYGWIN)
set_target_properties(${SWIG_MODULE_${name}_REAL_NAME} PROPERTIES SUFFIX ".pyd")
endif()
endif ()
endmacro()
#
# Like TARGET_LINK_LIBRARIES but for swig modules
#
macro(SWIG_LINK_LIBRARIES name)
if(SWIG_MODULE_${name}_REAL_NAME)
target_link_libraries(${SWIG_MODULE_${name}_REAL_NAME} ${ARGN})
else()
message(SEND_ERROR "Cannot find Swig library \"${name}\".")
endif()
endmacro()
+33
View File
@@ -0,0 +1,33 @@
if(NOT PKG_CONFIG_FOUND)
INCLUDE(FindPkgConfig)
endif()
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)
+14
View File
@@ -0,0 +1,14 @@
# Copyright 2018 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
include(CMakeFindDependencyMacro)
set(target_deps "@TARGET_DEPENDENCIES@")
foreach(dep IN LISTS target_deps)
find_dependency(${dep})
endforeach()
include("${CMAKE_CURRENT_LIST_DIR}/@TARGET@Targets.cmake")
+24
View File
@@ -0,0 +1,24 @@
# 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
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
########################################################################
# Setup dependencies
########################################################################
find_package(Doxygen)
########################################################################
# Begin conditional configuration
########################################################################
if(ENABLE_DOXYGEN)
########################################################################
# Add subdirectories
########################################################################
add_subdirectory(doxygen)
endif(ENABLE_DOXYGEN)
+11
View File
@@ -0,0 +1,11 @@
This is the ieee802_11-write-a-block package meant as a guide to building
out-of-tree packages. To use the ieee802_11 blocks, the Python namespaces
is in 'ieee802_11', which is imported as:
import ieee802_11
See the Doxygen documentation for details about the blocks available
in this package. A quick listing of the details can be found in Python
after importing by using:
help(ieee802_11)
+4 -14
View File
@@ -1,21 +1,10 @@
# Copyright 2011 Free Software Foundation, Inc. # Copyright 2011 Free Software Foundation, Inc.
# #
# This file is part of GNU Radio # 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 # SPDX-License-Identifier: GPL-3.0-or-later
# 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 # Create the doxygen configuration file
@@ -28,6 +17,7 @@ file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
set(HAVE_DOT ${DOXYGEN_DOT_FOUND}) set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
set(enable_html_docs YES) set(enable_html_docs YES)
set(enable_latex_docs NO) set(enable_latex_docs NO)
set(enable_mathjax NO)
set(enable_xml_docs YES) set(enable_xml_docs YES)
configure_file( configure_file(
+571 -188
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-3
View File
@@ -1,3 +0,0 @@
/Makefile
/Makefile.in
-52
View File
@@ -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
+4 -15
View File
@@ -1,22 +1,11 @@
# #
# Copyright 2010 Free Software Foundation, Inc. # Copyright 2010 Free Software Foundation, Inc.
# #
# This file is part of GNU Radio # 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 # SPDX-License-Identifier: GPL-3.0-or-later
# 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. Python interface to contents of doxygen xml documentation.
@@ -64,7 +53,7 @@ u'Outputs the vital aadvark statistics.'
""" """
from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther from .doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
def _test(): def _test():
import os import os
+11 -22
View File
@@ -1,22 +1,11 @@
# #
# Copyright 2010 Free Software Foundation, Inc. # Copyright 2010 Free Software Foundation, Inc.
# #
# This file is part of GNU Radio # 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 # SPDX-License-Identifier: GPL-3.0-or-later
# 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. A base class is created.
@@ -30,18 +19,18 @@ import pdb
from xml.parsers.expat import ExpatError from xml.parsers.expat import ExpatError
from generated import compound from .generated import compound
class Base(object): class Base(object):
class Duplicate(StandardError): class Duplicate(Exception):
pass pass
class NoSuchMember(StandardError): class NoSuchMember(Exception):
pass pass
class ParsingError(StandardError): class ParsingError(Exception):
pass pass
def __init__(self, parse_data, top=None): def __init__(self, parse_data, top=None):
@@ -94,7 +83,7 @@ class Base(object):
for cls in self.mem_classes: for cls in self.mem_classes:
if cls.can_parse(mem): if cls.can_parse(mem):
return cls return cls
raise StandardError(("Did not find a class for object '%s'." \ raise Exception(("Did not find a class for object '%s'." \
% (mem.get_name()))) % (mem.get_name())))
def convert_mem(self, mem): def convert_mem(self, mem):
@@ -102,11 +91,11 @@ class Base(object):
cls = self.get_cls(mem) cls = self.get_cls(mem)
converted = cls.from_parse_data(mem, self.top) converted = cls.from_parse_data(mem, self.top)
if converted is None: if converted is None:
raise StandardError('No class matched this object.') raise Exception('No class matched this object.')
self.add_ref(converted) self.add_ref(converted)
return converted return converted
except StandardError, e: except Exception as e:
print e print(e)
@classmethod @classmethod
def includes(cls, inst): def includes(cls, inst):
+81 -36
View File
@@ -1,22 +1,11 @@
# #
# Copyright 2010 Free Software Foundation, Inc. # Copyright 2010 Free Software Foundation, Inc.
# #
# This file is part of GNU Radio # 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 # SPDX-License-Identifier: GPL-3.0-or-later
# 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 Classes providing more user-friendly interfaces to the doxygen xml
@@ -25,9 +14,9 @@ docs than the generated classes provide.
import os import os
from generated import index from .generated import index
from base import Base from .base import Base
from text import description from .text import description
class DoxyIndex(Base): class DoxyIndex(Base):
""" """
@@ -43,25 +32,20 @@ class DoxyIndex(Base):
self._root = index.parse(os.path.join(self._xml_path, 'index.xml')) self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
for mem in self._root.compound: for mem in self._root.compound:
converted = self.convert_mem(mem) converted = self.convert_mem(mem)
# For files we want the contents to be accessible directly # For files and namespaces we want the contents to be
# from the parent rather than having to go through the file # accessible directly from the parent rather than having
# object. # to go through the file object.
if self.get_cls(mem) == DoxyFile: if self.get_cls(mem) == DoxyFile:
if mem.name.endswith('.h'): if mem.name.endswith('.h'):
self._members += converted.members() self._members += converted.members()
self._members.append(converted) self._members.append(converted)
elif self.get_cls(mem) == DoxyNamespace:
self._members += converted.members()
self._members.append(converted)
else: else:
self._members.append(converted) 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): class DoxyCompMem(Base):
@@ -80,13 +64,29 @@ class DoxyCompMem(Base):
self._data['brief_description'] = bd self._data['brief_description'] = bd
self._data['detailed_description'] = dd self._data['detailed_description'] = dd
def set_parameters(self, data):
vs = [ddc.value for ddc in data.detaileddescription.content_]
pls = []
for v in vs:
if hasattr(v, 'parameterlist'):
pls += v.parameterlist
pis = []
for pl in pls:
pis += pl.parameteritem
dpis = []
for pi in pis:
dpi = DoxyParameterItem(pi)
dpi._parse()
dpis.append(dpi)
self._data['params'] = dpis
class DoxyCompound(DoxyCompMem): class DoxyCompound(DoxyCompMem):
pass pass
class DoxyMember(DoxyCompMem): class DoxyMember(DoxyCompMem):
pass pass
class DoxyFunction(DoxyMember): class DoxyFunction(DoxyMember):
__module__ = "gnuradio.utils.doxyxml" __module__ = "gnuradio.utils.doxyxml"
@@ -98,10 +98,13 @@ class DoxyFunction(DoxyMember):
return return
super(DoxyFunction, self)._parse() super(DoxyFunction, self)._parse()
self.set_descriptions(self._parse_data) self.set_descriptions(self._parse_data)
self._data['params'] = [] self.set_parameters(self._parse_data)
prms = self._parse_data.param if not self._data['params']:
for prm in prms: # If the params weren't set by a comment then just grab the names.
self._data['params'].append(DoxyParam(prm)) 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']) brief_description = property(lambda self: self.data()['brief_description'])
detailed_description = property(lambda self: self.data()['detailed_description']) detailed_description = property(lambda self: self.data()['detailed_description'])
@@ -121,9 +124,39 @@ class DoxyParam(DoxyMember):
self.set_descriptions(self._parse_data) self.set_descriptions(self._parse_data)
self._data['declname'] = self._parse_data.declname self._data['declname'] = self._parse_data.declname
@property
def description(self):
descriptions = []
if self.brief_description:
descriptions.append(self.brief_description)
if self.detailed_description:
descriptions.append(self.detailed_description)
return '\n\n'.join(descriptions)
brief_description = property(lambda self: self.data()['brief_description']) brief_description = property(lambda self: self.data()['brief_description'])
detailed_description = property(lambda self: self.data()['detailed_description']) detailed_description = property(lambda self: self.data()['detailed_description'])
declname = property(lambda self: self.data()['declname']) name = property(lambda self: self.data()['declname'])
class DoxyParameterItem(DoxyMember):
"""A different representation of a parameter in Doxygen."""
def _parse(self):
if self._parsed:
return
super(DoxyParameterItem, self)._parse()
names = []
for nl in self._parse_data.parameternamelist:
for pn in nl.parametername:
names.append(description(pn))
# Just take first name
self._data['name'] = names[0]
# Get description
pd = description(self._parse_data.get_parameterdescription())
self._data['description'] = pd
description = property(lambda self: self.data()['description'])
name = property(lambda self: self.data()['name'])
class DoxyClass(DoxyCompound): class DoxyClass(DoxyCompound):
@@ -139,12 +172,14 @@ class DoxyClass(DoxyCompound):
if self._error: if self._error:
return return
self.set_descriptions(self._retrieved_data.compounddef) self.set_descriptions(self._retrieved_data.compounddef)
self.set_parameters(self._retrieved_data.compounddef)
# Sectiondef.kind tells about whether private or public. # Sectiondef.kind tells about whether private or public.
# We just ignore this for now. # We just ignore this for now.
self.process_memberdefs() self.process_memberdefs()
brief_description = property(lambda self: self.data()['brief_description']) brief_description = property(lambda self: self.data()['brief_description'])
detailed_description = property(lambda self: self.data()['detailed_description']) detailed_description = property(lambda self: self.data()['detailed_description'])
params = property(lambda self: self.data()['params'])
Base.mem_classes.append(DoxyClass) Base.mem_classes.append(DoxyClass)
@@ -177,6 +212,16 @@ class DoxyNamespace(DoxyCompound):
kind = 'namespace' kind = 'namespace'
def _parse(self):
if self._parsed:
return
super(DoxyNamespace, self)._parse()
self.retrieve_data()
self.set_descriptions(self._retrieved_data.compounddef)
if self._error:
return
self.process_memberdefs()
Base.mem_classes.append(DoxyNamespace) Base.mem_classes.append(DoxyNamespace)
@@ -227,11 +272,11 @@ class DoxyOther(Base):
__module__ = "gnuradio.utils.doxyxml" __module__ = "gnuradio.utils.doxyxml"
kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum', 'dir', 'page']) kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum',
'dir', 'page', 'signal', 'slot', 'property'])
@classmethod @classmethod
def can_parse(cls, obj): def can_parse(cls, obj):
return obj.kind in cls.kinds return obj.kind in cls.kinds
Base.mem_classes.append(DoxyOther) Base.mem_classes.append(DoxyOther)
File diff suppressed because it is too large Load Diff
-50
View File
@@ -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;
}
-44
View File
@@ -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/>&lt;iostream&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;aadvark.h&quot;</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/>&lt;&lt;<sp/></highlight><highlight class="stringliteral">&quot;aadvark<sp/>is<sp/>&quot;</highlight><highlight class="normal"><sp/>&lt;&lt;<sp/>aadvarkness<sp/>&lt;&lt;<sp/></highlight><highlight class="stringliteral">&quot;/10<sp/>aadvarky&quot;</highlight><highlight class="normal"><sp/>&lt;&lt;<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/>&gt;<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/>&lt;&lt;<sp/></highlight><highlight class="stringliteral">&quot;He<sp/>is<sp/>aadvarky<sp/>enough&quot;</highlight><highlight class="normal"><sp/>&lt;&lt;<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/>&lt;&lt;<sp/></highlight><highlight class="stringliteral">&quot;He<sp/>is<sp/>not<sp/>aadvarky<sp/>enough&quot;</highlight><highlight class="normal"><sp/>&lt;&lt;<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/>&lt;iostream&gt;</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>
+3 -3
View File
@@ -4,14 +4,14 @@
Generated Mon Feb 9 19:08:05 2009 by generateDS.py. 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 minidom
from xml.dom import Node from xml.dom import Node
import sys import sys
import compoundsuper as supermod from . import compoundsuper as supermod
from compoundsuper import MixedContainer from .compoundsuper import MixedContainer
class DoxygenTypeSub(supermod.DoxygenType): class DoxygenTypeSub(supermod.DoxygenType):
+17 -18
View File
@@ -4,9 +4,9 @@
# Generated Thu Jun 11 18:44:25 2009 by generateDS.py. # Generated Thu Jun 11 18:44:25 2009 by generateDS.py.
# #
import sys import sys
import getopt
from string import lower as str_lower
from xml.dom import minidom from xml.dom import minidom
from xml.dom import Node from xml.dom import Node
@@ -19,9 +19,9 @@ from xml.dom import Node
try: try:
from generatedssuper import GeneratedsSuper from generatedssuper import GeneratedsSuper
except ImportError, exp: except ImportError as exp:
class GeneratedsSuper: class GeneratedsSuper(object):
def format_string(self, input_data, input_name=''): def format_string(self, input_data, input_name=''):
return input_data return input_data
def format_integer(self, input_data, input_name=''): def format_integer(self, input_data, input_name=''):
@@ -64,7 +64,7 @@ def showIndent(outfile, level):
outfile.write(' ') outfile.write(' ')
def quote_xml(inStr): def quote_xml(inStr):
s1 = (isinstance(inStr, basestring) and inStr or s1 = (isinstance(inStr, str) and inStr or
'%s' % inStr) '%s' % inStr)
s1 = s1.replace('&', '&amp;') s1 = s1.replace('&', '&amp;')
s1 = s1.replace('<', '&lt;') s1 = s1.replace('<', '&lt;')
@@ -72,7 +72,7 @@ def quote_xml(inStr):
return s1 return s1
def quote_attrib(inStr): def quote_attrib(inStr):
s1 = (isinstance(inStr, basestring) and inStr or s1 = (isinstance(inStr, str) and inStr or
'%s' % inStr) '%s' % inStr)
s1 = s1.replace('&', '&amp;') s1 = s1.replace('&', '&amp;')
s1 = s1.replace('<', '&lt;') s1 = s1.replace('<', '&lt;')
@@ -102,7 +102,7 @@ def quote_python(inStr):
return '"""%s"""' % s1 return '"""%s"""' % s1
class MixedContainer: class MixedContainer(object):
# Constants for category: # Constants for category:
CategoryNone = 0 CategoryNone = 0
CategoryText = 1 CategoryText = 1
@@ -4221,7 +4221,7 @@ class codelineType(GeneratedsSuper):
if attrs.get('lineno'): if attrs.get('lineno'):
try: try:
self.lineno = int(attrs.get('lineno').value) self.lineno = int(attrs.get('lineno').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (lineno): %s' % exp) raise ValueError('Bad integer attribute (lineno): %s' % exp)
if attrs.get('refkind'): if attrs.get('refkind'):
self.refkind = attrs.get('refkind').value self.refkind = attrs.get('refkind').value
@@ -4504,12 +4504,12 @@ class referenceType(GeneratedsSuper):
if attrs.get('endline'): if attrs.get('endline'):
try: try:
self.endline = int(attrs.get('endline').value) self.endline = int(attrs.get('endline').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (endline): %s' % exp) raise ValueError('Bad integer attribute (endline): %s' % exp)
if attrs.get('startline'): if attrs.get('startline'):
try: try:
self.startline = int(attrs.get('startline').value) self.startline = int(attrs.get('startline').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (startline): %s' % exp) raise ValueError('Bad integer attribute (startline): %s' % exp)
if attrs.get('refid'): if attrs.get('refid'):
self.refid = attrs.get('refid').value self.refid = attrs.get('refid').value
@@ -4627,17 +4627,17 @@ class locationType(GeneratedsSuper):
if attrs.get('bodystart'): if attrs.get('bodystart'):
try: try:
self.bodystart = int(attrs.get('bodystart').value) self.bodystart = int(attrs.get('bodystart').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (bodystart): %s' % exp) raise ValueError('Bad integer attribute (bodystart): %s' % exp)
if attrs.get('line'): if attrs.get('line'):
try: try:
self.line = int(attrs.get('line').value) self.line = int(attrs.get('line').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (line): %s' % exp) raise ValueError('Bad integer attribute (line): %s' % exp)
if attrs.get('bodyend'): if attrs.get('bodyend'):
try: try:
self.bodyend = int(attrs.get('bodyend').value) self.bodyend = int(attrs.get('bodyend').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (bodyend): %s' % exp) raise ValueError('Bad integer attribute (bodyend): %s' % exp)
if attrs.get('bodyfile'): if attrs.get('bodyfile'):
self.bodyfile = attrs.get('bodyfile').value self.bodyfile = attrs.get('bodyfile').value
@@ -6778,12 +6778,12 @@ class docTableType(GeneratedsSuper):
if attrs.get('rows'): if attrs.get('rows'):
try: try:
self.rows = int(attrs.get('rows').value) self.rows = int(attrs.get('rows').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (rows): %s' % exp) raise ValueError('Bad integer attribute (rows): %s' % exp)
if attrs.get('cols'): if attrs.get('cols'):
try: try:
self.cols = int(attrs.get('cols').value) self.cols = int(attrs.get('cols').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (cols): %s' % exp) raise ValueError('Bad integer attribute (cols): %s' % exp)
def buildChildren(self, child_, nodeName_): def buildChildren(self, child_, nodeName_):
if child_.nodeType == Node.ELEMENT_NODE and \ if child_.nodeType == Node.ELEMENT_NODE and \
@@ -7108,7 +7108,7 @@ class docHeadingType(GeneratedsSuper):
if attrs.get('level'): if attrs.get('level'):
try: try:
self.level = int(attrs.get('level').value) self.level = int(attrs.get('level').value)
except ValueError, exp: except ValueError as exp:
raise ValueError('Bad integer attribute (level): %s' % exp) raise ValueError('Bad integer attribute (level): %s' % exp)
def buildChildren(self, child_, nodeName_): def buildChildren(self, child_, nodeName_):
if child_.nodeType == Node.TEXT_NODE: if child_.nodeType == Node.TEXT_NODE:
@@ -8283,7 +8283,7 @@ Options:
""" """
def usage(): def usage():
print USAGE_TEXT print(USAGE_TEXT)
sys.exit(1) sys.exit(1)
@@ -8339,4 +8339,3 @@ if __name__ == '__main__':
main() main()
#import pdb #import pdb
#pdb.run('main()') #pdb.run('main()')
+2 -2
View File
@@ -8,9 +8,9 @@ from xml.dom import minidom
import os import os
import sys import sys
import compound from . import compound
import indexsuper as supermod from . import indexsuper as supermod
class DoxygenTypeSub(supermod.DoxygenType): class DoxygenTypeSub(supermod.DoxygenType):
def __init__(self, version=None, compound=None): def __init__(self, version=None, compound=None):
+8 -9
View File
@@ -4,9 +4,9 @@
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py. # Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
# #
import sys import sys
import getopt
from string import lower as str_lower
from xml.dom import minidom from xml.dom import minidom
from xml.dom import Node from xml.dom import Node
@@ -19,9 +19,9 @@ from xml.dom import Node
try: try:
from generatedssuper import GeneratedsSuper from generatedssuper import GeneratedsSuper
except ImportError, exp: except ImportError as exp:
class GeneratedsSuper: class GeneratedsSuper(object):
def format_string(self, input_data, input_name=''): def format_string(self, input_data, input_name=''):
return input_data return input_data
def format_integer(self, input_data, input_name=''): def format_integer(self, input_data, input_name=''):
@@ -64,7 +64,7 @@ def showIndent(outfile, level):
outfile.write(' ') outfile.write(' ')
def quote_xml(inStr): def quote_xml(inStr):
s1 = (isinstance(inStr, basestring) and inStr or s1 = (isinstance(inStr, str) and inStr or
'%s' % inStr) '%s' % inStr)
s1 = s1.replace('&', '&amp;') s1 = s1.replace('&', '&amp;')
s1 = s1.replace('<', '&lt;') s1 = s1.replace('<', '&lt;')
@@ -72,7 +72,7 @@ def quote_xml(inStr):
return s1 return s1
def quote_attrib(inStr): def quote_attrib(inStr):
s1 = (isinstance(inStr, basestring) and inStr or s1 = (isinstance(inStr, str) and inStr or
'%s' % inStr) '%s' % inStr)
s1 = s1.replace('&', '&amp;') s1 = s1.replace('&', '&amp;')
s1 = s1.replace('<', '&lt;') s1 = s1.replace('<', '&lt;')
@@ -102,7 +102,7 @@ def quote_python(inStr):
return '"""%s"""' % s1 return '"""%s"""' % s1
class MixedContainer: class MixedContainer(object):
# Constants for category: # Constants for category:
CategoryNone = 0 CategoryNone = 0
CategoryText = 1 CategoryText = 1
@@ -462,7 +462,7 @@ Options:
""" """
def usage(): def usage():
print USAGE_TEXT print(USAGE_TEXT)
sys.exit(1) sys.exit(1)
@@ -520,4 +520,3 @@ if __name__ == '__main__':
main() main()
#import pdb #import pdb
#pdb.run('main()') #pdb.run('main()')
-16
View File
@@ -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@
+5 -16
View File
@@ -1,22 +1,11 @@
# #
# Copyright 2010 Free Software Foundation, Inc. # Copyright 2010 Free Software Foundation, Inc.
# #
# This file is part of GNU Radio # 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 # SPDX-License-Identifier: GPL-3.0-or-later
# 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. Utilities for extracting text from generated classes.
@@ -26,7 +15,7 @@ def is_string(txt):
if isinstance(txt, str): if isinstance(txt, str):
return True return True
try: try:
if isinstance(txt, unicode): if isinstance(txt, str):
return True return True
except NameError: except NameError:
pass pass
@@ -49,7 +38,7 @@ def description_bit(obj):
elif is_string(obj): elif is_string(obj):
return obj return obj
else: else:
raise StandardError('Expecting a string or something with content, content_ or value attribute') raise Exception('Expecting a string or something with content, content_ or value attribute')
# If this bit is a paragraph then add one some line breaks. # If this bit is a paragraph then add one some line breaks.
if hasattr(obj, 'name') and obj.name == 'para': if hasattr(obj, 'name') and obj.name == 'para':
result += "\n\n" result += "\n\n"
+2 -2
View File
@@ -1,6 +1,6 @@
/*! /*!
* \defgroup block GNU Radio HOWTO C++ Signal Processing Blocks * \defgroup block GNU Radio IEEE802_11 C++ Signal Processing Blocks
* \brief All C++ blocks that can be used from the HOWTO GNU Radio * \brief All C++ blocks that can be used from the IEEE802_11 GNU Radio
* module are listed here or in the subcategories below. * module are listed here or in the subcategories below.
* *
*/ */
+2 -2
View File
@@ -1,8 +1,8 @@
/*! \mainpage /*! \mainpage
Welcome to the GNU Radio HOWTO Block Welcome to the GNU Radio IEEE802_11 Block
This is the intro page for the Doxygen manual generated for the HOWTO This is the intro page for the Doxygen manual generated for the IEEE802_11
block (docs/doxygen/other/main_page.dox). Edit it to add more detailed block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
documentation about the new GNU Radio modules contained in this documentation about the new GNU Radio modules contained in this
project. project.
+19
View File
@@ -0,0 +1,19 @@
#ifndef PYDOC_MACROS_H
#define PYDOC_MACROS_H
#define __EXPAND(x) x
#define __COUNT(_1, _2, _3, _4, _5, _6, _7, COUNT, ...) COUNT
#define __VA_SIZE(...) __EXPAND(__COUNT(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1))
#define __CAT1(a, b) a##b
#define __CAT2(a, b) __CAT1(a, b)
#define __DOC1(n1) __doc_##n1
#define __DOC2(n1, n2) __doc_##n1##_##n2
#define __DOC3(n1, n2, n3) __doc_##n1##_##n2##_##n3
#define __DOC4(n1, n2, n3, n4) __doc_##n1##_##n2##_##n3##_##n4
#define __DOC5(n1, n2, n3, n4, n5) __doc_##n1##_##n2##_##n3##_##n4##_##n5
#define __DOC6(n1, n2, n3, n4, n5, n6) __doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6
#define __DOC7(n1, n2, n3, n4, n5, n6, n7) \
__doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6##_##n7
#define DOC(...) __EXPAND(__EXPAND(__CAT2(__DOC, __VA_SIZE(__VA_ARGS__)))(__VA_ARGS__))
#endif // PYDOC_MACROS_H
-255
View File
@@ -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)
+346
View File
@@ -0,0 +1,346 @@
#
# Copyright 2010-2012 Free Software Foundation, Inc.
#
# This file was generated by gr_modtool, a tool from the GNU Radio framework
# This file is a part of gnuradio
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
"""
Updates the *pydoc_h files for a module
Execute using: python update_pydoc.py xml_path outputfilename
The file instructs Pybind11 to transfer the doxygen comments into the
python docstrings.
"""
import os, sys, time, glob, re, json
from argparse import ArgumentParser
from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile
from doxyxml import DoxyOther, 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
friendname = make_name(item.name())
is_a_block = item.has_member(friendname, DoxyFriend)
# But now sometimes the make function isn't a friend so check again.
if not is_a_block:
is_a_block = di.has_member(friendname, DoxyFunction)
return is_a_block
class Block2(object):
"""
Checks if doxyxml produced objects correspond to a new style
gnuradio block.
"""
@classmethod
def includes(cls, item):
if not isinstance(item, DoxyClass):
return False
# Check for a parsing error.
if item.error():
return False
is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther)
return is_a_block2
def utoascii(text):
"""
Convert unicode text into ascii and escape quotes and backslashes.
"""
if text is None:
return ''
out = text.encode('ascii', 'replace')
# swig will require us to replace blackslash with 4 backslashes
# TODO: evaluate what this should be for pybind11
out = out.replace(b'\\', b'\\\\\\\\')
out = out.replace(b'"', b'\\"').decode('ascii')
return str(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()
def format_params(parameteritems):
output = ['Args:']
template = ' {0} : {1}'
for pi in parameteritems:
output.append(template.format(pi.name, pi.description))
return '\n'.join(output)
entry_templ = '%feature("docstring") {name} "{docstring}"'
def make_entry(obj, name=None, templ="{description}", description=None, params=[]):
"""
Create a docstring key/value pair, where the key is the object name.
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 hasattr(obj,'_parse_data') and hasattr(obj._parse_data,'definition'):
name=obj._parse_data.definition.split(' ')[-1]
if "operator " in name:
return ''
if description is None:
description = combine_descriptions(obj)
if params:
description += '\n\n'
description += utoascii(format_params(params))
docstring = templ.format(description=description)
return {name: docstring}
def make_class_entry(klass, description=None, ignored_methods=[], params=None):
"""
Create a class docstring key/value pair.
"""
if params is None:
params = klass.params
output = {}
output.update(make_entry(klass, description=description, params=params))
for func in klass.in_category(DoxyFunction):
if func.name() not in ignored_methods:
name = klass.name() + '::' + func.name()
output.update(make_entry(func, name=name))
return output
def make_block_entry(di, block):
"""
Create class and function docstrings of a gnuradio block
"""
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.update(make_class_entry(block, description=super_description))
output.update(make_entry(make_func, description=super_description,
params=block.params))
return output
def make_block2_entry(di, block):
"""
Create class and function docstrings of a new style gnuradio block
"""
# For new style blocks all the relevant documentation should be
# associated with the 'make' method.
class_description = combine_descriptions(block)
make_func = block.get_member('make', DoxyFunction)
make_description = combine_descriptions(make_func)
description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description
# Associate the combined description with the class and
# the make function.
output = {}
output.update(make_class_entry(
block, description=description,
ignored_methods=['make'], params=make_func.params))
makename = block.name() + '::make'
output.update(make_entry(
make_func, name=makename, description=description,
params=make_func.params))
return output
def get_docstrings_dict(di, custom_output=None):
output = {}
if custom_output:
output.update(custom_output)
# Create docstrings for the blocks.
blocks = di.in_category(Block)
blocks2 = di.in_category(Block2)
make_funcs = set([])
for block in blocks:
try:
make_func = di.get_member(make_name(block.name()), DoxyFunction)
# Don't want to risk writing to output twice.
if make_func.name() not in make_funcs:
make_funcs.add(make_func.name())
output.update(make_block_entry(di, block))
except block.ParsingError:
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
raise
for block in blocks2:
try:
make_func = block.get_member('make', DoxyFunction)
make_func_name = block.name() +'::make'
# Don't want to risk writing to output twice.
if make_func_name not in make_funcs:
make_funcs.add(make_func_name)
output.update(make_block2_entry(di, block))
except block.ParsingError:
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
raise
# 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 and not f.name().startswith('std::')]
for f in funcs:
try:
output.update(make_entry(f))
except f.ParsingError:
sys.stderr.write('Parsing error for function {0}\n'.format(f.name()))
# Create docstrings for classes
block_names = [block.name() for block in blocks]
block_names += [block.name() for block in blocks2]
klasses = [k for k in di.in_category(DoxyClass)
if k.name() not in block_names and not k.name().startswith('std::')]
for k in klasses:
try:
output.update(make_class_entry(k))
except k.ParsingError:
sys.stderr.write('Parsing error for class {0}\n'.format(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.
return output
def sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, output_dir, filter_str=None):
if filter_str:
docstrings_dict = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str)}
with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
for pydoc_file in pydoc_files:
if filter_str:
filter_str2 = "::".join((filter_str,os.path.split(pydoc_file)[-1].split('_pydoc_template.h')[0]))
docstrings_dict2 = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str2)}
else:
docstrings_dict2 = docstrings_dict
file_in = open(pydoc_file,'r').read()
for key, value in docstrings_dict2.items():
file_in_tmp = file_in
try:
doc_key = key.split("::")
# if 'gr' in doc_key:
# doc_key.remove('gr')
doc_key = '_'.join(doc_key)
regexp = r'(__doc_{} =\sR\"doc\()[^)]*(\)doc\")'.format(doc_key)
regexp = re.compile(regexp, re.MULTILINE)
(file_in, nsubs) = regexp.subn(r'\1'+value+r'\2', file_in, count=1)
if nsubs == 1:
status_file.write("PASS: " + pydoc_file + "\n")
except KeyboardInterrupt:
raise KeyboardInterrupt
except: # be permissive, TODO log, but just leave the docstring blank
status_file.write("FAIL: " + pydoc_file + "\n")
file_in = file_in_tmp
output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
# FIXME: Remove this debug print
print('output docstrings to {}'.format(output_pathname))
with open(output_pathname,'w') as file_out:
file_out.write(file_in)
def copy_docstring_templates(pydoc_files, output_dir):
with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
for pydoc_file in pydoc_files:
file_in = open(pydoc_file,'r').read()
output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
# FIXME: Remove this debug print
print('copy docstrings to {}'.format(output_pathname))
with open(output_pathname,'w') as file_out:
file_out.write(file_in)
status_file.write("DONE")
def argParse():
"""Parses commandline args."""
desc='Scrape the doxygen generated xml for docstrings to insert into python bindings'
parser = ArgumentParser(description=desc)
parser.add_argument("function", help="Operation to perform on docstrings", choices=["scrape","sub","copy"])
parser.add_argument("--xml_path")
parser.add_argument("--bindings_dir")
parser.add_argument("--output_dir")
parser.add_argument("--json_path")
parser.add_argument("--filter", default=None)
return parser.parse_args()
if __name__ == "__main__":
# Parse command line options and set up doxyxml.
args = argParse()
if args.function.lower() == 'scrape':
di = DoxyIndex(args.xml_path)
docstrings_dict = get_docstrings_dict(di)
with open(args.json_path, 'w') as fp:
json.dump(docstrings_dict, fp)
elif args.function.lower() == 'sub':
with open(args.json_path, 'r') as fp:
docstrings_dict = json.load(fp)
pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, args.output_dir, args.filter)
elif args.function.lower() == 'copy':
pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
copy_docstring_templates(pydoc_files, args.output_dir)
+687 -1855
View File
File diff suppressed because it is too large Load Diff
+771 -2003
View File
File diff suppressed because it is too large Load Diff
+1229 -3751
View File
File diff suppressed because it is too large Load Diff
+1262 -3810
View File
File diff suppressed because it is too large Load Diff
+945 -1948
View File
File diff suppressed because it is too large Load Diff
+19 -2
View File
@@ -1,3 +1,20 @@
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
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
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
-18
View File
@@ -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>
+35
View File
@@ -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
-57
View File
@@ -1,57 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Decode MAC</name>
<key>ieee802_11_decode_mac</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>byte</type>
<vlen>48</vlen>
</sink>
<source>
<name>out</name>
<type>message</type>
<optional>1</optional>
</source>
</block>
+35
View File
@@ -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
-50
View File
@@ -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>
+21
View File
@@ -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
+56
View File
@@ -0,0 +1,56 @@
# auto-generated by grc.converter
id: ieee802_11_frame_equalizer
label: WiFi Frame Equalizer
category: '[IEEE802.11]'
parameters:
- id: algo
label: Algorithm
dtype: raw
default: ieee802_11.LS
- 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
-105
View File
@@ -1,105 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Frame Equalizer</name>
<key>ieee802_11_frame_equalizer</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.frame_equalizer($algo, $freq, $bw, $log, $debug)</make>
<callback>set_algorithm($algo)</callback>
<callback>set_frequency($freq)</callback>
<callback>set_bandwidth($bw)</callback>
<param>
<name>Algorithm</name>
<key>algo</key>
<value>ieee802_11.LS</value>
<type>int</type>
<option>
<name>LS</name>
<key>ieee802_11.LS</key>
</option>
<option>
<name>LMS</name>
<key>ieee802_11.LMS</key>
</option>
<option>
<name>Comb</name>
<key>ieee802_11.COMB</key>
</option>
<option>
<name>STA</name>
<key>ieee802_11.STA</key>
</option>
</param>
<param>
<name>Frequency</name>
<key>freq</key>
<value>5.89e9</value>
<type>real</type>
</param>
<param>
<name>Bandwidth</name>
<key>bw</key>
<value>10e6</value>
<type>real</type>
</param>
<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>64</vlen>
<nports>1</nports>
</sink>
<source>
<name>out</name>
<type>byte</type>
<vlen>48</vlen>
<nports>1</nports>
</source>
<source>
<name>symbols</name>
<type>message</type>
<optional>1</optional>
</source>
</block>
+48
View File
@@ -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
-61
View File
@@ -1,61 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi MAC</name>
<key>ieee802_11_mac</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>
+34
View File
@@ -0,0 +1,34 @@
# auto-generated by grc.converter
id: ieee802_11_mapper
label: WiFi Mapper
category: '[IEEE802.11]'
parameters:
- id: encoding
label: Encoding
dtype: raw
default: ieee802_11.BPSK_1_2
- 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'
templates:
imports: import ieee802_11
make: ieee802_11.mapper(${encoding}, ${debug})
callbacks:
- set_encoding(${encoding})
file_format: 1
-80
View File
@@ -1,80 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Mapper</name>
<key>ieee802_11_mapper</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>
-43
View File
@@ -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>
+34
View File
@@ -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
-54
View File
@@ -1,54 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Parse MAC</name>
<key>ieee802_11_parse_mac</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>
+45
View File
@@ -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
-69
View File
@@ -1,69 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Sync Long</name>
<key>ieee802_11_sync_long</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>
+54
View File
@@ -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
-83
View File
@@ -1,83 +0,0 @@
<?xml version="1.0"?>
<block>
<name>WiFi Sync Short</name>
<key>ieee802_11_sync_short</key>
<category>[IEEE802.11]</category>
<import>import ieee802_11</import>
<make>ieee802_11.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>
-89
View File
@@ -1,89 +0,0 @@
#
# 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(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
constellations.h
decode_mac.h
ether_encap.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}/gnuradio/ieee802_11
COMPONENT "ieee802_11_devel"
)
-40
View File
@@ -1,40 +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 @GUARD_NAME@
#define @GUARD_NAME@
#include <ieee802-11/api.h>
#include <gnuradio/sync_block.h>
namespace gr {
namespace ieee802_11 {
class IEEE802_11_API @NAME@ : virtual public sync_block
{
public:
typedef boost::shared_ptr<@NAME@> sptr;
static sptr make(int length);
virtual int length() const = 0;
virtual void set_length(int length) = 0;
};
} /* namespace blocks */
} /* namespace gr */
#endif /* @GUARD_NAME@ */
+27
View File
@@ -0,0 +1,27 @@
# Copyright 2011,2012 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
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
########################################################################
# Install public header files
########################################################################
install(FILES
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
DESTINATION include/ieee802_11
)
+22
View File
@@ -0,0 +1,22 @@
/*
* 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
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
#ifndef INCLUDED_IEEE802_11_API_H
#define INCLUDED_IEEE802_11_API_H
#include <gnuradio/attributes.h>
#ifdef gnuradio_ieee802_11_EXPORTS
#define IEEE802_11_API __GR_ATTR_EXPORT
#else
#define IEEE802_11_API __GR_ATTR_IMPORT
#endif
#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 std::shared_ptr<chunks_to_symbols> sptr;
static sptr make(); static sptr make();
}; };
} /* namespace ieee802_11 */ } /* namespace ieee802_11 */
@@ -18,8 +18,8 @@
#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_H #ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_H
#define INCLUDED_IEEE802_11_CONSTELLATIONS_H #define INCLUDED_IEEE802_11_CONSTELLATIONS_H
#include <ieee802-11/api.h>
#include <gnuradio/digital/constellation.h> #include <gnuradio/digital/constellation.h>
#include <ieee802_11/api.h>
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
@@ -27,45 +27,48 @@ namespace ieee802_11 {
class IEEE802_11_API constellation_bpsk : virtual public digital::constellation class IEEE802_11_API constellation_bpsk : virtual public digital::constellation
{ {
public: public:
typedef boost::shared_ptr<gr::ieee802_11::constellation_bpsk> sptr; typedef std::shared_ptr<gr::ieee802_11::constellation_bpsk> sptr;
static sptr make(); static sptr make();
sptr base() { return std::dynamic_pointer_cast<gr::ieee802_11::constellation_bpsk>(shared_from_this()); }
protected: protected:
constellation_bpsk(); constellation_bpsk();
}; };
class IEEE802_11_API constellation_qpsk : virtual public digital::constellation class IEEE802_11_API constellation_qpsk : virtual public digital::constellation
{ {
public: public:
typedef boost::shared_ptr<gr::ieee802_11::constellation_qpsk> sptr; typedef std::shared_ptr<gr::ieee802_11::constellation_qpsk> sptr;
static sptr make(); static sptr make();
sptr base() { return std::dynamic_pointer_cast<gr::ieee802_11::constellation_qpsk>(shared_from_this()); }
protected: protected:
constellation_qpsk(); constellation_qpsk();
}; };
class IEEE802_11_API constellation_16qam : virtual public digital::constellation class IEEE802_11_API constellation_16qam : virtual public digital::constellation
{ {
public: public:
typedef boost::shared_ptr<gr::ieee802_11::constellation_16qam> sptr; typedef std::shared_ptr<gr::ieee802_11::constellation_16qam> sptr;
static sptr make(); static sptr make();
sptr base() { return std::dynamic_pointer_cast<gr::ieee802_11::constellation_16qam>(shared_from_this()); }
protected: protected:
constellation_16qam(); constellation_16qam();
}; };
class IEEE802_11_API constellation_64qam : virtual public digital::constellation class IEEE802_11_API constellation_64qam : virtual public digital::constellation
{ {
public: public:
typedef boost::shared_ptr<gr::ieee802_11::constellation_64qam> sptr; typedef std::shared_ptr<gr::ieee802_11::constellation_64qam> sptr;
static sptr make(); static sptr make();
sptr base() { return std::dynamic_pointer_cast<gr::ieee802_11::constellation_64qam>(shared_from_this()); }
protected: protected:
constellation_64qam(); constellation_64qam();
}; };
} // namespace ieee802_11 } // namespace ieee802_11
} // namespace gr } // namespace gr
#endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_H */ #endif /* INCLUDED_IEEE802_11_CONSTELLATIONS_H */
@@ -17,8 +17,8 @@
#ifndef INCLUDED_IEEE802_11_DECODE_MAC_H #ifndef INCLUDED_IEEE802_11_DECODE_MAC_H
#define INCLUDED_IEEE802_11_DECODE_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 {
@@ -26,15 +26,11 @@ namespace ieee802_11 {
class IEEE802_11_API decode_mac : virtual public block class IEEE802_11_API decode_mac : virtual public block
{ {
public: public:
typedef std::shared_ptr<decode_mac> sptr;
typedef boost::shared_ptr<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_DECODE_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 std::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 */
+40
View File
@@ -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 std::shared_ptr<extract_csi> sptr;
static sptr make();
};
} // namespace ieee802_11
} // namespace gr
#endif /* INCLUDED_IEEE802_11_EXTRACT_CSI_H */
@@ -20,29 +20,29 @@
#ifndef INCLUDED_IEEE802_11_FRAME_EQUALIZER_H #ifndef INCLUDED_IEEE802_11_FRAME_EQUALIZER_H
#define INCLUDED_IEEE802_11_FRAME_EQUALIZER_H #define INCLUDED_IEEE802_11_FRAME_EQUALIZER_H
#include <ieee802-11/api.h>
#include <gnuradio/block.h> #include <gnuradio/block.h>
#include <ieee802_11/api.h>
enum Equalizer {
LS = 0,
LMS = 1,
COMB = 2,
STA = 3,
};
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
enum Equalizer {
LS = 0,
LMS = 1,
COMB = 2,
STA = 3,
};
class IEEE802_11_API frame_equalizer : virtual public gr::block class IEEE802_11_API frame_equalizer : virtual public gr::block
{ {
public: public:
typedef boost::shared_ptr<frame_equalizer> sptr; typedef std::shared_ptr<frame_equalizer> sptr;
static sptr make(Equalizer algo, double freq, double bw, static sptr make(Equalizer algo, double freq, double bw, bool log, bool debug);
bool log, bool debug); virtual void set_algorithm(Equalizer algo) = 0;
virtual void set_algorithm(Equalizer algo) = 0; virtual void set_bandwidth(double bw) = 0;
virtual void set_bandwidth(double bw) = 0; virtual void set_frequency(double freq) = 0;
virtual void set_frequency(double freq) = 0;
}; };
} // namespace ieee802_11 } // namespace ieee802_11
@@ -17,8 +17,8 @@
#ifndef INCLUDED_IEEE802_11_MAC_H #ifndef INCLUDED_IEEE802_11_MAC_H
#define INCLUDED_IEEE802_11_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 {
@@ -26,14 +26,13 @@ namespace ieee802_11 {
class IEEE802_11_API mac : virtual public block class IEEE802_11_API mac : virtual public block
{ {
public: public:
typedef std::shared_ptr<mac> sptr;
typedef boost::shared_ptr<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_MAC_H */ #endif /* INCLUDED_IEEE802_11_MAC_H */
@@ -17,33 +17,32 @@
#ifndef INCLUDED_IEEE802_11_MAPPER_H #ifndef INCLUDED_IEEE802_11_MAPPER_H
#define INCLUDED_IEEE802_11_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 {
BPSK_1_2 = 0,
BPSK_3_4 = 1,
QPSK_1_2 = 2,
QPSK_3_4 = 3,
QAM16_1_2 = 4,
QAM16_3_4 = 5,
QAM64_2_3 = 6,
QAM64_3_4 = 7,
};
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
enum Encoding {
BPSK_1_2 = 0,
BPSK_3_4 = 1,
QPSK_1_2 = 2,
QPSK_3_4 = 3,
QAM16_1_2 = 4,
QAM16_3_4 = 5,
QAM64_2_3 = 6,
QAM64_3_4 = 7,
};
class IEEE802_11_API mapper : virtual public block class IEEE802_11_API mapper : virtual public block
{ {
public: public:
typedef std::shared_ptr<mapper> sptr;
typedef boost::shared_ptr<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_MAPPER_H */ #endif /* INCLUDED_IEEE802_11_MAPPER_H */
@@ -17,8 +17,8 @@
#ifndef INCLUDED_IEEE802_11_PARSE_MAC_H #ifndef INCLUDED_IEEE802_11_PARSE_MAC_H
#define INCLUDED_IEEE802_11_PARSE_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 {
@@ -26,10 +26,8 @@ namespace ieee802_11 {
class IEEE802_11_API parse_mac : virtual public block class IEEE802_11_API parse_mac : virtual public block
{ {
public: public:
typedef std::shared_ptr<parse_mac> sptr;
typedef boost::shared_ptr<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
@@ -18,8 +18,9 @@
#ifndef INCLUDED_IEEE802_11_SIGNAL_FIELD_H #ifndef INCLUDED_IEEE802_11_SIGNAL_FIELD_H
#define INCLUDED_IEEE802_11_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>
#include <memory>
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
@@ -27,15 +28,14 @@ namespace ieee802_11 {
class IEEE802_11_API 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<signal_field> sptr; typedef std::shared_ptr<signal_field> sptr;
static sptr make(); static sptr make();
protected: protected:
signal_field(); signal_field();
}; };
} // namespace ieee802_11 } // namespace ieee802_11
} // namespace gr } // namespace gr
#endif /* INCLUDED_IEEE802_11_SIGNAL_FIELD_H */ #endif /* INCLUDED_IEEE802_11_SIGNAL_FIELD_H */
@@ -17,8 +17,8 @@
#ifndef INCLUDED_IEEE802_11_SYNC_LONG_H #ifndef INCLUDED_IEEE802_11_SYNC_LONG_H
#define INCLUDED_IEEE802_11_SYNC_LONG_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 {
@@ -26,14 +26,11 @@ namespace ieee802_11 {
class IEEE802_11_API sync_long : virtual public block class IEEE802_11_API sync_long : virtual public block
{ {
public: public:
typedef std::shared_ptr<sync_long> sptr;
typedef boost::shared_ptr<sync_long> sptr; static sptr make(unsigned int sync_length, bool log = false, bool debug = false);
static sptr make(unsigned int sync_length,
bool log = false, bool debug = false);
}; };
} // namespace ieee802_11 } // namespace ieee802_11
} // namespace gr } // namespace gr
#endif /* INCLUDED_IEEE802_11_SYNC_LONG_H */ #endif /* INCLUDED_IEEE802_11_SYNC_LONG_H */
@@ -17,8 +17,8 @@
#ifndef INCLUDED_IEEE802_11_SYNC_SHORT_H #ifndef INCLUDED_IEEE802_11_SYNC_SHORT_H
#define INCLUDED_IEEE802_11_SYNC_SHORT_H #define INCLUDED_IEEE802_11_SYNC_SHORT_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,14 @@ namespace ieee802_11 {
class IEEE802_11_API sync_short : virtual public block class IEEE802_11_API sync_short : virtual public block
{ {
public: public:
typedef std::shared_ptr<sync_short> sptr;
typedef boost::shared_ptr<sync_short> sptr; static sptr make(double threshold,
static sptr make(double threshold, unsigned int min_plateau, bool log = false, bool debug = false); unsigned int min_plateau,
bool log = false,
bool debug = false);
}; };
} // namespace ieee802_11 } // namespace ieee802_11
} // namespace gr } // namespace gr
#endif /* INCLUDED_IEEE802_11_SYNC_SHORT_H */ #endif /* INCLUDED_IEEE802_11_SYNC_SHORT_H */
+66 -96
View File
@@ -1,99 +1,26 @@
# Copyright 2011,2012,2016,2018,2019 Free Software Foundation, Inc.
# #
# Copyright (C) 2013, 2016 Bastian Bloessl <bloessl@ccs-labs.org> # This file was generated by gr_modtool, a tool from the GNU Radio framework
# This file is a part of gr-ieee802_11
# #
# This program is free software: you can redistribute it and/or modify # SPDX-License-Identifier: GPL-3.0-or-later
# 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/>.
# #
######################################################################## ########################################################################
# 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}
chunks_to_symbols_impl.cc chunks_to_symbols_impl.cc
constellations_impl.cc constellations_impl.cc
decode_mac.cc decode_mac.cc
@@ -103,6 +30,7 @@ list(APPEND gr_ieee802_11_sources
equalizer/lms.cc equalizer/lms.cc
equalizer/sta.cc equalizer/sta.cc
ether_encap_impl.cc ether_encap_impl.cc
extract_csi_impl.cc
frame_equalizer_impl.cc frame_equalizer_impl.cc
mac.cc mac.cc
mapper.cc mapper.cc
@@ -111,25 +39,67 @@ list(APPEND gr_ieee802_11_sources
sync_long.cc sync_long.cc
sync_short.cc sync_short.cc
utils.cc utils.cc
viterbi_decoder.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
${LOG4CPP_LIBRARIES} viterbi_decoder/viterbi_decoder_x86.cc
) )
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
Volk::volk
)
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
) )
+53 -54
View File
@@ -17,81 +17,80 @@
#include "chunks_to_symbols_impl.h" #include "chunks_to_symbols_impl.h"
#include "utils.h" #include "utils.h"
#include <gnuradio/io_signature.h> #include <gnuradio/io_signature.h>
#include <gnuradio/tag_checker.h>
#include <assert.h> #include <assert.h>
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("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_bpsk = constellation_bpsk::make();
d_qpsk = constellation_qpsk::make(); d_qpsk = constellation_qpsk::make();
d_16qam = constellation_16qam::make(); d_16qam = constellation_16qam::make();
d_64qam = constellation_64qam::make(); d_64qam = constellation_64qam::make();
d_mapping = d_bpsk; 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);
switch (encoding) { switch (encoding) {
case BPSK_1_2: case BPSK_1_2:
case BPSK_3_4: case BPSK_3_4:
d_mapping = d_bpsk; d_mapping = d_bpsk;
break; break;
case QPSK_1_2: case QPSK_1_2:
case QPSK_3_4: case QPSK_3_4:
d_mapping = d_qpsk; d_mapping = d_qpsk;
break; break;
case QAM16_1_2: case QAM16_1_2:
case QAM16_3_4: case QAM16_3_4:
d_mapping = d_16qam; d_mapping = d_16qam;
break; break;
case QAM64_2_3: case QAM64_2_3:
case QAM64_3_4: case QAM64_3_4:
d_mapping = d_64qam; d_mapping = d_64qam;
break; break;
default: default:
throw std::invalid_argument("wrong encoding"); throw std::invalid_argument("wrong encoding");
break; break;
} }
for(int i = 0; i < ninput_items[0]; i++) { for (int i = 0; i < ninput_items[0]; i++) {
d_mapping->map_to_points(in[i], out + i); d_mapping->map_to_points(in[i], out + i);
} }
return ninput_items[0]; return ninput_items[0];
} }
+13 -13
View File
@@ -17,8 +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> #include <ieee802_11/constellations.h>
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
@@ -26,20 +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);
private: private:
boost::shared_ptr<gr::digital::constellation> d_mapping; std::shared_ptr<gr::digital::constellation> d_mapping;
constellation_bpsk::sptr d_bpsk; constellation_bpsk::sptr d_bpsk;
constellation_qpsk::sptr d_qpsk; constellation_qpsk::sptr d_qpsk;
constellation_16qam::sptr d_16qam; constellation_16qam::sptr d_16qam;
constellation_64qam::sptr d_64qam; constellation_64qam::sptr d_64qam;
}; };
} /* namespace ieee802_11 */ } /* namespace ieee802_11 */
+160 -162
View File
@@ -18,218 +18,216 @@
using namespace gr::ieee802_11; using namespace gr::ieee802_11;
constellation_bpsk::sptr constellation_bpsk::sptr constellation_bpsk::make()
constellation_bpsk::make() { {
return constellation_bpsk::sptr(new constellation_bpsk_impl()); return constellation_bpsk::sptr(new constellation_bpsk_impl());
} }
constellation_bpsk::constellation_bpsk() {} constellation_bpsk::constellation_bpsk() {}
constellation_bpsk_impl::constellation_bpsk_impl() { constellation_bpsk_impl::constellation_bpsk_impl()
d_constellation.resize(2); {
d_constellation[0] = gr_complex(-1, 0); d_constellation.resize(2);
d_constellation[1] = gr_complex(1, 0); d_constellation[0] = gr_complex(-1, 0);
d_rotational_symmetry = 2; d_constellation[1] = gr_complex(1, 0);
d_dimensionality = 1; d_rotational_symmetry = 2;
calc_arity(); d_dimensionality = 1;
calc_arity();
} }
constellation_bpsk_impl::~constellation_bpsk_impl() { constellation_bpsk_impl::~constellation_bpsk_impl() {}
}
unsigned int unsigned int constellation_bpsk_impl::decision_maker(const gr_complex* sample)
constellation_bpsk_impl::decision_maker(const gr_complex *sample) { {
return (real(*sample) > 0); return (real(*sample) > 0);
} }
/**********************************************************/ /**********************************************************/
constellation_qpsk::sptr constellation_qpsk::sptr constellation_qpsk::make()
constellation_qpsk::make() { {
return constellation_qpsk::sptr(new constellation_qpsk_impl()); return constellation_qpsk::sptr(new constellation_qpsk_impl());
} }
constellation_qpsk::constellation_qpsk() {} constellation_qpsk::constellation_qpsk() {}
constellation_qpsk_impl::constellation_qpsk_impl() { constellation_qpsk_impl::constellation_qpsk_impl()
const float level = sqrt(float(0.5)); {
d_constellation.resize(4); const float level = sqrt(float(0.5));
// Gray-coded d_constellation.resize(4);
d_constellation[0] = gr_complex(-level, -level); // Gray-coded
d_constellation[1] = gr_complex( level, -level); d_constellation[0] = gr_complex(-level, -level);
d_constellation[2] = gr_complex(-level, level); d_constellation[1] = gr_complex(level, -level);
d_constellation[3] = gr_complex( level, level); d_constellation[2] = gr_complex(-level, level);
d_constellation[3] = gr_complex(level, level);
d_rotational_symmetry = 4; d_rotational_symmetry = 4;
d_dimensionality = 1; d_dimensionality = 1;
calc_arity(); calc_arity();
} }
constellation_qpsk_impl::~constellation_qpsk_impl() { constellation_qpsk_impl::~constellation_qpsk_impl() {}
}
unsigned int unsigned int constellation_qpsk_impl::decision_maker(const gr_complex* sample)
constellation_qpsk_impl::decision_maker(const gr_complex *sample) { {
return 2*(imag(*sample)>0) + (real(*sample)>0); return 2 * (imag(*sample) > 0) + (real(*sample) > 0);
} }
/**********************************************************/ /**********************************************************/
constellation_16qam::sptr constellation_16qam::sptr constellation_16qam::make()
constellation_16qam::make() { {
return constellation_16qam::sptr(new constellation_16qam_impl()); return constellation_16qam::sptr(new constellation_16qam_impl());
} }
constellation_16qam::constellation_16qam() {} constellation_16qam::constellation_16qam() {}
constellation_16qam_impl::constellation_16qam_impl() constellation_16qam_impl::constellation_16qam_impl()
{ {
const float level = sqrt(float(0.1)); const float level = sqrt(float(0.1));
d_constellation.resize(16); d_constellation.resize(16);
d_constellation[ 0] = gr_complex(-3*level,-3*level); d_constellation[0] = gr_complex(-3 * level, -3 * level);
d_constellation[ 1] = 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[2] = gr_complex(-1 * level, -3 * level);
d_constellation[ 3] = 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[4] = gr_complex(-3 * level, 3 * level);
d_constellation[ 5] = 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[6] = gr_complex(-1 * level, 3 * level);
d_constellation[ 7] = 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[8] = gr_complex(-3 * level, -1 * level);
d_constellation[ 9] = 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[10] = gr_complex(-1 * level, -1 * level);
d_constellation[11] = 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[12] = gr_complex(-3 * level, 1 * level);
d_constellation[13] = 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[14] = gr_complex(-1 * level, 1 * level);
d_constellation[15] = gr_complex( 1*level, 1*level); d_constellation[15] = gr_complex(1 * level, 1 * level);
d_rotational_symmetry = 4; d_rotational_symmetry = 4;
d_dimensionality = 1; d_dimensionality = 1;
calc_arity(); calc_arity();
} }
constellation_16qam_impl::~constellation_16qam_impl() { constellation_16qam_impl::~constellation_16qam_impl() {}
}
unsigned int unsigned int constellation_16qam_impl::decision_maker(const gr_complex* sample)
constellation_16qam_impl::decision_maker(const gr_complex *sample)
{ {
unsigned int ret = 0; unsigned int ret = 0;
const float level = sqrt(float(0.1)); const float level = sqrt(float(0.1));
float re = sample->real(); float re = sample->real();
float im = sample->imag(); float im = sample->imag();
ret |= re > 0; ret |= re > 0;
ret |= (std::abs(re) < (2*level)) << 1; ret |= (std::abs(re) < (2 * level)) << 1;
ret |= (im > 0) << 2; ret |= (im > 0) << 2;
ret |= (std::abs(im) < (2*level)) << 3; ret |= (std::abs(im) < (2 * level)) << 3;
return ret; return ret;
} }
/**********************************************************/ /**********************************************************/
constellation_64qam::sptr constellation_64qam::sptr constellation_64qam::make()
constellation_64qam::make() { {
return constellation_64qam::sptr(new constellation_64qam_impl()); return constellation_64qam::sptr(new constellation_64qam_impl());
} }
constellation_64qam::constellation_64qam() {} constellation_64qam::constellation_64qam() {}
constellation_64qam_impl::constellation_64qam_impl() { constellation_64qam_impl::constellation_64qam_impl()
const float level = sqrt(float(1/42.0)); {
d_constellation.resize(64); const float level = sqrt(float(1 / 42.0));
d_constellation.resize(64);
d_constellation[ 0] = gr_complex(-7*level,-7*level); d_constellation[0] = gr_complex(-7 * level, -7 * level);
d_constellation[ 1] = 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[2] = gr_complex(-1 * level, -7 * level);
d_constellation[ 3] = 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[4] = gr_complex(-5 * level, -7 * level);
d_constellation[ 5] = 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[6] = gr_complex(-3 * level, -7 * level);
d_constellation[ 7] = 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[8] = gr_complex(-7 * level, 7 * level);
d_constellation[ 9] = 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[10] = gr_complex(-1 * level, 7 * level);
d_constellation[11] = 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[12] = gr_complex(-5 * level, 7 * level);
d_constellation[13] = 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[14] = gr_complex(-3 * level, 7 * level);
d_constellation[15] = 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[16] = gr_complex(-7 * level, -1 * level);
d_constellation[17] = 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[18] = gr_complex(-1 * level, -1 * level);
d_constellation[19] = 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[20] = gr_complex(-5 * level, -1 * level);
d_constellation[21] = 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[22] = gr_complex(-3 * level, -1 * level);
d_constellation[23] = 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[24] = gr_complex(-7 * level, 1 * level);
d_constellation[25] = 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[26] = gr_complex(-1 * level, 1 * level);
d_constellation[27] = 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[28] = gr_complex(-5 * level, 1 * level);
d_constellation[29] = 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[30] = gr_complex(-3 * level, 1 * level);
d_constellation[31] = 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[32] = gr_complex(-7 * level, -5 * level);
d_constellation[33] = 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[34] = gr_complex(-1 * level, -5 * level);
d_constellation[35] = 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[36] = gr_complex(-5 * level, -5 * level);
d_constellation[37] = 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[38] = gr_complex(-3 * level, -5 * level);
d_constellation[39] = 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[40] = gr_complex(-7 * level, 5 * level);
d_constellation[41] = 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[42] = gr_complex(-1 * level, 5 * level);
d_constellation[43] = 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[44] = gr_complex(-5 * level, 5 * level);
d_constellation[45] = 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[46] = gr_complex(-3 * level, 5 * level);
d_constellation[47] = 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[48] = gr_complex(-7 * level, -3 * level);
d_constellation[49] = 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[50] = gr_complex(-1 * level, -3 * level);
d_constellation[51] = 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[52] = gr_complex(-5 * level, -3 * level);
d_constellation[53] = 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[54] = gr_complex(-3 * level, -3 * level);
d_constellation[55] = 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[56] = gr_complex(-7 * level, 3 * level);
d_constellation[57] = 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[58] = gr_complex(-1 * level, 3 * level);
d_constellation[59] = 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[60] = gr_complex(-5 * level, 3 * level);
d_constellation[61] = 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[62] = gr_complex(-3 * level, 3 * level);
d_constellation[63] = gr_complex( 3*level, 3*level); d_constellation[63] = gr_complex(3 * level, 3 * level);
d_rotational_symmetry = 4; d_rotational_symmetry = 4;
d_dimensionality = 1; d_dimensionality = 1;
calc_arity(); calc_arity();
} }
constellation_64qam_impl::~constellation_64qam_impl() { constellation_64qam_impl::~constellation_64qam_impl() {}
}
unsigned int constellation_64qam_impl::decision_maker(const gr_complex* sample)
unsigned int {
constellation_64qam_impl::decision_maker(const gr_complex *sample) { unsigned int ret = 0;
unsigned int ret = 0; const float level = sqrt(float(1 / 42.0));
const float level = sqrt(float(1/42.0)); float re = sample->real();
float re = sample->real(); float im = sample->imag();
float im = sample->imag();
ret |= re > 0;
ret |= re > 0; ret |= (std::abs(re) < (4 * level)) << 1;
ret |= (std::abs(re) < (4*level)) << 1; ret |= (std::abs(re) < (6 * level) && std::abs(re) > (2 * level)) << 2;
ret |= (std::abs(re) < (6*level) && std::abs(re) > (2*level)) << 2; ret |= (im > 0) << 3;
ret |= (im > 0) << 3; ret |= (std::abs(im) < (4 * level)) << 4;
ret |= (std::abs(im) < (4*level)) << 4; ret |= (std::abs(im) < (6 * level) && std::abs(im) > (2 * level)) << 5;
ret |= (std::abs(im) < (6*level) && std::abs(im) > (2*level)) << 5;
return ret;
return ret;
} }
+13 -16
View File
@@ -17,7 +17,7 @@
#ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H #ifndef INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H
#define INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H #define INCLUDED_IEEE802_11_CONSTELLATIONS_IMPL_H
#include <ieee802-11/constellations.h> #include <ieee802_11/constellations.h>
namespace gr { namespace gr {
namespace ieee802_11 { namespace ieee802_11 {
@@ -25,43 +25,40 @@ namespace ieee802_11 {
class constellation_bpsk_impl : public constellation_bpsk class constellation_bpsk_impl : public constellation_bpsk
{ {
public: public:
constellation_bpsk_impl(); constellation_bpsk_impl();
~constellation_bpsk_impl(); ~constellation_bpsk_impl();
unsigned int decision_maker(const gr_complex *sample); unsigned int decision_maker(const gr_complex* sample);
}; };
class constellation_qpsk_impl : public constellation_qpsk class constellation_qpsk_impl : public constellation_qpsk
{ {
public: public:
constellation_qpsk_impl(); constellation_qpsk_impl();
~constellation_qpsk_impl(); ~constellation_qpsk_impl();
unsigned int decision_maker(const gr_complex *sample); unsigned int decision_maker(const gr_complex* sample);
}; };
class constellation_16qam_impl : public constellation_16qam class constellation_16qam_impl : public constellation_16qam
{ {
public: public:
constellation_16qam_impl(); constellation_16qam_impl();
~constellation_16qam_impl(); ~constellation_16qam_impl();
unsigned int decision_maker(const gr_complex *sample); unsigned int decision_maker(const gr_complex* sample);
}; };
class constellation_64qam_impl : public constellation_64qam class constellation_64qam_impl : public constellation_64qam
{ {
public: public:
constellation_64qam_impl(); constellation_64qam_impl();
~constellation_64qam_impl(); ~constellation_64qam_impl();
unsigned int decision_maker(const gr_complex *sample); unsigned int decision_maker(const gr_complex* sample);
}; };
+186 -176
View File
@@ -14,234 +14,244 @@
* 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/>.
*/ */
#include <ieee802-11/decode_mac.h> #include <ieee802_11/decode_mac.h>
#include "utils.h" #include "utils.h"
#include "viterbi_decoder.h" #include "viterbi_decoder/viterbi_decoder.h"
#include <boost/crc.hpp>
#include <gnuradio/io_signature.h> #include <gnuradio/io_signature.h>
#include <boost/crc.hpp>
#include <boost/format.hpp>
#include <iomanip>
using namespace gr::ieee802_11; using namespace gr::ieee802_11;
#define LINKTYPE_IEEE802_11 105 /* http://www.tcpdump.org/linktypes.html */ #define LINKTYPE_IEEE802_11 105 /* http://www.tcpdump.org/linktypes.html */
class decode_mac_impl : public decode_mac { class decode_mac_impl : public decode_mac
{
public: public:
decode_mac_impl(bool log, bool debug) : decode_mac_impl(bool log, bool debug)
block("decode_mac", : block("decode_mac",
gr::io_signature::make(1, 1, 48), gr::io_signature::make(1, 1, 48),
gr::io_signature::make(0, 0, 0)), gr::io_signature::make(0, 0, 0)),
d_log(log), d_log(log),
d_debug(debug), d_debug(debug),
d_snr(0), d_ofdm(BPSK_1_2),
d_nom_freq(0.0), d_frame(d_ofdm, 0),
d_freq_offset(0.0), d_frame_complete(true)
d_ofdm(BPSK_1_2), {
d_frame(d_ofdm, 0), message_port_register_out(pmt::mp("out"));
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)
{
int general_work (int noutput_items, gr_vector_int& ninput_items, const uint8_t* in = (const uint8_t*)input_items[0];
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;
int i = 0; std::vector<gr::tag_t> tags;
const uint64_t nread = this->nitems_read(0);
std::vector<gr::tag_t> tags; dout << "Decode MAC: input " << ninput_items[0] << std::endl;
const uint64_t nread = this->nitems_read(0);
dout << "Decode MAC: input " << ninput_items[0] << std::endl; while (i < ninput_items[0]) {
while(i < ninput_items[0]) { get_tags_in_range(tags, 0, nread + i, nread + i + 1);
get_tags_in_range(tags, 0, nread + i, nread + i + 1, if (tags.size()) {
pmt::string_to_symbol("wifi_start")); 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;
if(tags.size()) { // Enter tags into metadata dictionary
if (d_frame_complete == false) { d_meta = pmt::make_dict();
dout << "Warning: starting to receive new frame before old frame was complete" << std::endl; for (auto tag : tags)
dout << "Already copied " << copied << " out of " << d_frame.n_sym << " symbols of last frame" << std::endl; d_meta = pmt::dict_add(d_meta, tag.key, tag.value);
}
d_frame_complete = false;
pmt::pmt_t dict = tags[0].value; int len_data = pmt::to_uint64(pmt::dict_ref(
int len_data = pmt::to_uint64(pmt::dict_ref(dict, pmt::mp("frame_bytes"), pmt::from_uint64(MAX_PSDU_SIZE+1))); d_meta, pmt::mp("frame bytes"), pmt::from_uint64(MAX_PSDU_SIZE + 1)));
int encoding = pmt::to_uint64(pmt::dict_ref(dict, pmt::mp("encoding"), pmt::from_uint64(0))); int encoding = pmt::to_uint64(
d_snr = pmt::to_double(pmt::dict_ref(dict, pmt::mp("snr"), pmt::from_double(0))); pmt::dict_ref(d_meta, pmt::mp("encoding"), pmt::from_uint64(0)));
d_nom_freq = pmt::to_double(pmt::dict_ref(dict, pmt::mp("freq"), pmt::from_double(0)));
d_freq_offset = pmt::to_double(pmt::dict_ref(dict, pmt::mp("freq_offset"), pmt::from_double(0)));
ofdm_param ofdm = ofdm_param((Encoding)encoding); ofdm_param ofdm = ofdm_param((Encoding)encoding);
frame_param frame = frame_param(ofdm, len_data); frame_param frame = frame_param(ofdm, len_data);
// check for maximum frame size // check for maximum frame size
if(frame.n_sym <= MAX_SYM && frame.psdu_size <= MAX_PSDU_SIZE) { if (frame.n_sym <= MAX_SYM && frame.psdu_size <= MAX_PSDU_SIZE) {
d_ofdm = ofdm; d_ofdm = ofdm;
d_frame = frame; d_frame = frame;
copied = 0; copied = 0;
dout << "Decode MAC: frame start -- len " << len_data dout << "Decode MAC: frame start -- len " << len_data << " symbols "
<< " symbols " << frame.n_sym << " encoding " << frame.n_sym << " encoding " << encoding << std::endl;
<< encoding << std::endl; } else {
} else { dout << "Dropping frame which is too large (symbols or bits)"
dout << "Dropping frame which is too large (symbols or bits)" << std::endl; << std::endl;
} }
} }
if(copied < d_frame.n_sym) { if (copied < d_frame.n_sym) {
dout << "copy one symbol, copied " << copied << " out of " << d_frame.n_sym << std::endl; dout << "copy one symbol, copied " << copied << " out of "
std::memcpy(d_rx_symbols + (copied * 48), in, 48); << d_frame.n_sym << std::endl;
copied++; std::memcpy(d_rx_symbols + (copied * 48), in, 48);
copied++;
if(copied == d_frame.n_sym) { if (copied == d_frame.n_sym) {
dout << "received complete frame - decoding" << std::endl; dout << "received complete frame - decoding" << std::endl;
decode(); decode();
in += 48; in += 48;
i++; i++;
d_frame_complete = true; d_frame_complete = true;
break; break;
} }
} }
in += 48; in += 48;
i++; i++;
} }
consume(0, i); consume(0, i);
return 0; return 0;
} }
void decode() { void decode()
{
for(int i = 0; i < d_frame.n_sym * 48; i++) { for (int i = 0; i < d_frame.n_sym * 48; i++) {
for(int k = 0; k < d_ofdm.n_bpsc; k++) { 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)); d_rx_bits[i * d_ofdm.n_bpsc + k] = !!(d_rx_symbols[i] & (1 << k));
} }
} }
deinterleave(); deinterleave();
uint8_t *decoded = d_decoder.decode(&d_ofdm, &d_frame, d_deinterleaved_bits); uint8_t* decoded = d_decoder.decode(&d_ofdm, &d_frame, d_deinterleaved_bits);
descramble(decoded); descramble(decoded);
print_output(); print_output();
// skip service field // skip service field
boost::crc_32_type result; boost::crc_32_type result;
result.process_bytes(out_bytes + 2, d_frame.psdu_size); result.process_bytes(out_bytes + 2, d_frame.psdu_size);
if(result.checksum() != 558161692) { if (result.checksum() != 558161692) {
dout << "checksum wrong -- dropping" << std::endl; dout << "checksum wrong -- dropping" << std::endl;
return; return;
} }
mylog(boost::format("encoding: %1% - length: %2% - symbols: %3%") mylog(boost::format("encoding: %1% - length: %2% - symbols: %3%") %
% d_ofdm.encoding % d_frame.psdu_size % d_frame.n_sym); d_ofdm.encoding % d_frame.psdu_size % d_frame.n_sym);
// create PDU // create PDU
pmt::pmt_t blob = pmt::make_blob(out_bytes + 2, d_frame.psdu_size - 4); pmt::pmt_t blob = pmt::make_blob(out_bytes + 2, d_frame.psdu_size - 4);
pmt::pmt_t enc = pmt::from_uint64(d_ofdm.encoding); d_meta =
pmt::pmt_t dict = pmt::make_dict(); pmt::dict_add(d_meta, pmt::mp("dlt"), pmt::from_long(LINKTYPE_IEEE802_11));
dict = pmt::dict_add(dict, pmt::mp("encoding"), enc);
dict = pmt::dict_add(dict, pmt::mp("snr"), pmt::from_double(d_snr));
dict = pmt::dict_add(dict, pmt::mp("nomfreq"), pmt::from_double(d_nom_freq));
dict = pmt::dict_add(dict, pmt::mp("freqofs"), pmt::from_double(d_freq_offset));
dict = pmt::dict_add(dict, pmt::mp("dlt"), pmt::from_long(LINKTYPE_IEEE802_11));
message_port_pub(pmt::mp("out"), pmt::cons(dict, blob));
}
void deinterleave() { message_port_pub(pmt::mp("out"), pmt::cons(d_meta, blob));
}
int n_cbps = d_ofdm.n_cbps; void deinterleave()
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++) { int n_cbps = d_ofdm.n_cbps;
first[j] = s * (j / s) + ((j + int(floor(16.0 * j / n_cbps))) % s); int first[n_cbps];
} int second[n_cbps];
int s = std::max(d_ofdm.n_bpsc / 2, 1);
for(int i = 0; i < n_cbps; i++) { for (int j = 0; j < n_cbps; j++) {
second[i] = 16 * i - (n_cbps - 1) * int(floor(16.0 * i / n_cbps)); first[j] = s * (j / s) + ((j + int(floor(16.0 * j / n_cbps))) % s);
} }
int count = 0; for (int i = 0; i < n_cbps; i++) {
for(int i = 0; i < d_frame.n_sym; i++) { second[i] = 16 * i - (n_cbps - 1) * int(floor(16.0 * i / n_cbps));
for(int k = 0; k < n_cbps; k++) { }
d_deinterleaved_bits[i * n_cbps + second[first[k]]] = d_rx_bits[i * n_cbps + k];
} 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) { void descramble(uint8_t* decoded_bits)
{
int state = 0; int state = 0;
std::memset(out_bytes, 0, d_frame.psdu_size+2); std::memset(out_bytes, 0, d_frame.psdu_size + 2);
for(int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
if(decoded_bits[i]) { if (decoded_bits[i]) {
state |= 1 << (6 - i); state |= 1 << (6 - i);
} }
} }
out_bytes[0] = state; out_bytes[0] = state;
int feedback; int feedback;
int bit; int bit;
for(int i = 7; i < d_frame.psdu_size*8+16; i++) { for (int i = 7; i < d_frame.psdu_size * 8 + 16; i++) {
feedback = ((!!(state & 64))) ^ (!!(state & 8)); feedback = ((!!(state & 64))) ^ (!!(state & 8));
bit = feedback ^ (decoded_bits[i] & 0x1); bit = feedback ^ (decoded_bits[i] & 0x1);
out_bytes[i/8] |= bit << (i%8); out_bytes[i / 8] |= bit << (i % 8);
state = ((state << 1) & 0x7e) | feedback; state = ((state << 1) & 0x7e) | feedback;
} }
} }
void print_output() { void print_output()
{
dout << std::endl; dout << std::endl;
dout << "psdu size" << d_frame.psdu_size << std::endl; dout << "psdu size" << d_frame.psdu_size << std::endl;
for(int i = 2; i < d_frame.psdu_size+2; i++) { 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 << " "; dout << std::setfill('0') << std::setw(2) << std::hex
if(i % 16 == 15) { << ((unsigned int)out_bytes[i] & 0xFF) << std::dec << " ";
dout << std::endl; if (i % 16 == 15) {
} dout << std::endl;
} }
dout << std::endl; }
for(int i = 2; i < d_frame.psdu_size+2; i++) { dout << std::endl;
if((out_bytes[i] > 31) && (out_bytes[i] < 127)) { for (int i = 2; i < d_frame.psdu_size + 2; i++) {
dout << ((char) out_bytes[i]); if ((out_bytes[i] > 31) && (out_bytes[i] < 127)) {
} else { dout << ((char)out_bytes[i]);
dout << "."; } else {
} dout << ".";
} }
dout << std::endl; }
} dout << std::endl;
}
private: private:
bool d_debug; bool d_debug;
bool d_log; bool d_log;
frame_param d_frame; pmt::pmt_t d_meta;
ofdm_param d_ofdm;
double d_snr; // dB
double d_nom_freq; // nominal frequency, Hz
double d_freq_offset; // frequency offset, Hz
viterbi_decoder d_decoder;
uint8_t d_rx_symbols[48 * MAX_SYM]; frame_param d_frame;
uint8_t d_rx_bits[MAX_ENCODED_BITS]; ofdm_param d_ofdm;
uint8_t d_deinterleaved_bits[MAX_ENCODED_BITS];
uint8_t out_bytes[MAX_PSDU_SIZE + 2]; // 2 for signal field
int copied; viterbi_decoder d_decoder;
bool d_frame_complete;
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::sptr decode_mac::make(bool log, bool debug)
decode_mac::make(bool log, bool debug) { {
return gnuradio::get_initial_sptr(new decode_mac_impl(log, debug)); return gnuradio::get_initial_sptr(new decode_mac_impl(log, debug));
} }

Some files were not shown because too many files have changed in this diff Show More