Compare commits
16 commits
maint-v3.7
...
master
Author | SHA1 | Date | |
---|---|---|---|
Thomas Kolb | 665ccd7f84 | ||
Thomas Kolb | 4707ff6d5c | ||
Thomas Kolb | 4549d8bbae | ||
Thomas Kolb | 0ff97ff980 | ||
Thomas Kolb | 042d341922 | ||
Thomas Kolb | 872fb0be7a | ||
Thomas Kolb | a6046b1458 | ||
Thomas Kolb | c805bee1fb | ||
Thomas Kolb | f38ad55b10 | ||
Thomas Kolb | 6bfcd3d142 | ||
Thomas Kolb | 1a4b6ec075 | ||
Thomas Kolb | 9107ccc7c0 | ||
Thomas Kolb | 718cf6366e | ||
Thomas Kolb | f7575b50fc | ||
Thomas Kolb | 9cd866b2ba | ||
Thomas Kolb | f003431b8c |
|
@ -1,4 +1,4 @@
|
||||||
# Copyright 2011,2012,2014,2016 Free Software Foundation, Inc.
|
# Copyright 2011,2012,2014,2016,2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
# This file is a part of gr-hamnet70
|
# This file is a part of gr-hamnet70
|
||||||
|
@ -21,94 +21,85 @@
|
||||||
########################################################################
|
########################################################################
|
||||||
# Project setup
|
# Project setup
|
||||||
########################################################################
|
########################################################################
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 3.8)
|
||||||
project(gr-hamnet70 CXX C)
|
project(gr-hamnet70 CXX C)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
#install to PyBOMBS target prefix if defined
|
# Install to PyBOMBS target prefix if defined
|
||||||
if(DEFINED ENV{PYBOMBS_PREFIX})
|
if(DEFINED ENV{PYBOMBS_PREFIX})
|
||||||
#IGNORE set(CMAKE_INSTALL_PREFIX $ENV{PYBOMBS_PREFIX})
|
#IGNORE set(CMAKE_INSTALL_PREFIX $ENV{PYBOMBS_PREFIX})
|
||||||
message(STATUS "PyBOMBS installed GNU Radio. Setting CMAKE_INSTALL_PREFIX to $ENV{PYBOMBS_PREFIX}")
|
message(STATUS "PyBOMBS installed GNU Radio. Setting CMAKE_INSTALL_PREFIX to $ENV{PYBOMBS_PREFIX}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#select the release build type by default to get optimization flags
|
# Select the release build type by default to get optimization flags
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
#IGNORE set(CMAKE_BUILD_TYPE "Release")
|
#IGNORE 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)
|
||||||
#IGNORE set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
#IGNORE set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
||||||
|
|
||||||
#make sure our local CMake Modules path comes first
|
# 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 the version information here
|
||||||
set(VERSION_INFO_MAJOR_VERSION 1)
|
set(VERSION_MAJOR 1)
|
||||||
set(VERSION_INFO_API_COMPAT 0)
|
set(VERSION_API 0)
|
||||||
set(VERSION_INFO_MINOR_VERSION 0)
|
set(VERSION_ABI 0)
|
||||||
set(VERSION_INFO_MAINT_VERSION git)
|
set(VERSION_PATCH git)
|
||||||
|
|
||||||
# Set cmake policies.
|
cmake_policy(SET CMP0011 NEW)
|
||||||
# This will suppress developer warnings during the cmake process that can occur
|
|
||||||
# if a newer cmake version than the minimum is used.
|
|
||||||
|
|
||||||
if(POLICY CMP0026)
|
# Enable generation of compile_commands.json for code completion engines
|
||||||
cmake_policy(SET CMP0026 OLD)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
endif()
|
|
||||||
if(POLICY CMP0043)
|
|
||||||
cmake_policy(SET CMP0043 OLD)
|
|
||||||
endif()
|
|
||||||
if(POLICY CMP0045)
|
|
||||||
cmake_policy(SET CMP0045 OLD)
|
|
||||||
endif()
|
|
||||||
if(POLICY CMP0046)
|
|
||||||
cmake_policy(SET CMP0046 OLD)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Compiler specific setup
|
# Compiler specific setup
|
||||||
########################################################################
|
########################################################################
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX AND 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)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
########################################################################
|
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
# Find boost
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
########################################################################
|
ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
if(UNIX AND EXISTS "/usr/lib64")
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
|
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
endif(UNIX AND EXISTS "/usr/lib64")
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
set(Boost_ADDITIONAL_VERSIONS
|
ELSE()
|
||||||
"1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39"
|
message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
|
||||||
"1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
|
ENDIF()
|
||||||
"1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49"
|
|
||||||
"1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54"
|
|
||||||
"1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
|
|
||||||
"1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
|
|
||||||
"1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
|
|
||||||
)
|
|
||||||
find_package(Boost "1.35" COMPONENTS filesystem system)
|
|
||||||
|
|
||||||
if(NOT Boost_FOUND)
|
IF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
message(FATAL_ERROR "Boost required to compile hamnet70")
|
SET(CMAKE_C_STANDARD 11)
|
||||||
endif()
|
ELSEIF(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
SET(CMAKE_C_STANDARD 11)
|
||||||
|
ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
SET(CMAKE_C_STANDARD 11)
|
||||||
|
ELSE()
|
||||||
|
message(WARNING "C standard could not be set because compiler is not GNU, Clang or MSVC.")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install directories
|
# Install directories
|
||||||
########################################################################
|
########################################################################
|
||||||
|
find_package(Gnuradio "3.8" REQUIRED)
|
||||||
|
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(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
|
||||||
|
endif(NOT CMAKE_MODULES_DIR)
|
||||||
|
|
||||||
set(GR_INCLUDE_DIR include/hamnet70)
|
set(GR_INCLUDE_DIR include/hamnet70)
|
||||||
set(GR_DATA_DIR share)
|
set(GR_CMAKE_DIR ${CMAKE_MODULES_DIR}/hamnet70)
|
||||||
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)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# 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
|
||||||
|
@ -133,22 +124,8 @@ endif(APPLE)
|
||||||
########################################################################
|
########################################################################
|
||||||
# Find gnuradio build dependencies
|
# Find gnuradio build dependencies
|
||||||
########################################################################
|
########################################################################
|
||||||
find_package(CppUnit)
|
|
||||||
find_package(Doxygen)
|
find_package(Doxygen)
|
||||||
|
|
||||||
# Search for GNU Radio and its components and versions. Add any
|
|
||||||
# components required to the list of GR_REQUIRED_COMPONENTS (in all
|
|
||||||
# caps such as FILTER or FFT) and change the version to the minimum
|
|
||||||
# API compatible version required.
|
|
||||||
set(GR_REQUIRED_COMPONENTS RUNTIME FILTER)
|
|
||||||
find_package(Gnuradio "3.7.2" REQUIRED)
|
|
||||||
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
|
||||||
include(GrVersion)
|
|
||||||
|
|
||||||
if(NOT CPPUNIT_FOUND)
|
|
||||||
message(FATAL_ERROR "CppUnit required to compile hamnet70")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Setup doxygen option
|
# Setup doxygen option
|
||||||
########################################################################
|
########################################################################
|
||||||
|
@ -158,29 +135,6 @@ else(DOXYGEN_FOUND)
|
||||||
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
|
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
|
||||||
endif(DOXYGEN_FOUND)
|
endif(DOXYGEN_FOUND)
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup the include and linker paths
|
|
||||||
########################################################################
|
|
||||||
include_directories(
|
|
||||||
${CMAKE_SOURCE_DIR}/lib
|
|
||||||
${CMAKE_SOURCE_DIR}/include
|
|
||||||
${CMAKE_BINARY_DIR}/lib
|
|
||||||
${CMAKE_BINARY_DIR}/include
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
${CPPUNIT_INCLUDE_DIRS}
|
|
||||||
${GNURADIO_ALL_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
link_directories(
|
|
||||||
${Boost_LIBRARY_DIRS}
|
|
||||||
${CPPUNIT_LIBRARY_DIRS}
|
|
||||||
${GNURADIO_RUNTIME_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set component parameters
|
|
||||||
set(GR_HAMNET70_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
|
|
||||||
set(GR_HAMNET70_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Create uninstall target
|
# Create uninstall target
|
||||||
########################################################################
|
########################################################################
|
||||||
|
@ -193,23 +147,21 @@ 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/hamnet70)
|
add_subdirectory(include/hamnet70)
|
||||||
add_subdirectory(lib)
|
add_subdirectory(lib)
|
||||||
|
add_subdirectory(apps)
|
||||||
|
add_subdirectory(docs)
|
||||||
add_subdirectory(swig)
|
add_subdirectory(swig)
|
||||||
add_subdirectory(python)
|
add_subdirectory(python)
|
||||||
add_subdirectory(grc)
|
add_subdirectory(grc)
|
||||||
add_subdirectory(apps)
|
|
||||||
add_subdirectory(docs)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install cmake search helper for this library
|
# Install cmake search helper for this library
|
||||||
########################################################################
|
########################################################################
|
||||||
if(NOT CMAKE_MODULES_DIR)
|
|
||||||
set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake)
|
|
||||||
endif(NOT CMAKE_MODULES_DIR)
|
|
||||||
|
|
||||||
install(FILES cmake/Modules/hamnet70Config.cmake
|
install(FILES cmake/Modules/hamnet70Config.cmake
|
||||||
DESTINATION ${CMAKE_MODULES_DIR}/hamnet70
|
DESTINATION ${CMAKE_MODULES_DIR}/hamnet70
|
||||||
|
|
|
@ -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)
|
|
|
@ -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)
|
|
|
@ -1,529 +0,0 @@
|
||||||
# Copyright 2010-2011,2014 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-hamnet70
|
|
||||||
#
|
|
||||||
# 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 can't 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) #can't 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}')
|
|
||||||
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
|
||||||
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}')
|
|
||||||
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
|
||||||
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}')
|
|
||||||
sys.path.append('${CMAKE_SOURCE_DIR}/python')
|
|
||||||
os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
|
|
||||||
os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import build_utils
|
|
||||||
root, inp = sys.argv[1:3]
|
|
||||||
for sig in sys.argv[3:]:
|
|
||||||
name = re.sub ('X+', sig, root)
|
|
||||||
d = build_utils.standard_dict(name, sig, '${component}')
|
|
||||||
build_utils.expand_template(d, inp, '_impl')
|
|
||||||
")
|
|
||||||
|
|
||||||
#make a list of all the generated files
|
|
||||||
unset(expanded_files_cc_impl)
|
|
||||||
unset(expanded_files_h_impl)
|
|
||||||
unset(expanded_files_h)
|
|
||||||
foreach(sig ${ARGN})
|
|
||||||
string(REGEX REPLACE "X+" ${sig} name ${root})
|
|
||||||
list(APPEND expanded_files_cc_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.cc)
|
|
||||||
list(APPEND expanded_files_h_impl ${CMAKE_CURRENT_BINARY_DIR}/${name}_impl.h)
|
|
||||||
list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/../include/gnuradio/${component}/${name}.h)
|
|
||||||
endforeach(sig)
|
|
||||||
unset(name)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.cc files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_cc_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.cc.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.cc.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#create a command to generate the _impl.h files
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${expanded_files_h_impl}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}_impl.h.t
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
|
|
||||||
${root} ${root}_impl.h.t ${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.cc source files depend on _impl.h to force generation
|
|
||||||
set_source_files_properties(${expanded_files_cc_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h_impl}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#make _impl.h source files depend on headers to force generation
|
|
||||||
set_source_files_properties(${expanded_files_h_impl}
|
|
||||||
PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
|
|
||||||
)
|
|
||||||
|
|
||||||
#install rules for the generated files
|
|
||||||
list(APPEND generated_sources ${expanded_files_cc_impl})
|
|
||||||
list(APPEND generated_headers ${expanded_files_h_impl})
|
|
||||||
|
|
||||||
endmacro(GR_EXPAND_X_CC_H_IMPL)
|
|
|
@ -1,63 +0,0 @@
|
||||||
# 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-hamnet70
|
|
||||||
#
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Detect /lib versus /lib64
|
|
||||||
########################################################################
|
|
||||||
if (CMAKE_INSTALL_LIBDIR MATCHES lib64)
|
|
||||||
set(LIB_SUFFIX 64)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
|
|
|
@ -1,242 +0,0 @@
|
||||||
# Copyright 2010-2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
|
||||||
# This file is a part of gr-hamnet70
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
")
|
|
|
@ -1,257 +0,0 @@
|
||||||
# Copyright 2010-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-hamnet70
|
|
||||||
#
|
|
||||||
# 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 formatted
|
|
||||||
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})
|
|
||||||
if(APPLE)
|
|
||||||
set(PYTHON_LINK_OPTIONS "-undefined dynamic_lookup")
|
|
||||||
else()
|
|
||||||
set(PYTHON_LINK_OPTIONS ${PYTHON_LIBRARIES})
|
|
||||||
endif(APPLE)
|
|
||||||
SWIG_LINK_LIBRARIES(${name} ${PYTHON_LINK_OPTIONS} ${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 don't search in lower prio inc dirs
|
|
||||||
return deps
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
ifiles = sys.argv[1].split(';')
|
|
||||||
deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
|
|
||||||
#sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
|
|
||||||
print(';'.join(set(deps)))
|
|
||||||
")
|
|
|
@ -1,144 +0,0 @@
|
||||||
# Copyright 2010-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-hamnet70
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
if(DEFINED __INCLUDED_GR_TEST_CMAKE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__INCLUDED_GR_TEST_CMAKE TRUE)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Add a unit test and setup the environment for a unit test.
|
|
||||||
# Takes the same arguments as the ADD_TEST function.
|
|
||||||
#
|
|
||||||
# Before calling set the following variables:
|
|
||||||
# GR_TEST_TARGET_DEPS - built targets for the library path
|
|
||||||
# GR_TEST_LIBRARY_DIRS - directories for the library path
|
|
||||||
# GR_TEST_PYTHON_DIRS - directories for the python path
|
|
||||||
# GR_TEST_ENVIRONS - other environment key/value pairs
|
|
||||||
########################################################################
|
|
||||||
function(GR_ADD_TEST test_name)
|
|
||||||
|
|
||||||
#Ensure that the build exe also appears in the PATH.
|
|
||||||
list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
|
|
||||||
|
|
||||||
#In the land of windows, all libraries must be in the PATH.
|
|
||||||
#Since the dependent libraries are not yet installed,
|
|
||||||
#we must manually set them in the PATH to run tests.
|
|
||||||
#The following appends the path of a target dependency.
|
|
||||||
foreach(target ${GR_TEST_TARGET_DEPS})
|
|
||||||
get_target_property(location ${target} LOCATION)
|
|
||||||
if(location)
|
|
||||||
get_filename_component(path ${location} PATH)
|
|
||||||
string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
|
|
||||||
list(APPEND GR_TEST_LIBRARY_DIRS ${path})
|
|
||||||
endif(location)
|
|
||||||
endforeach(target)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
#SWIG generates the python library files into a subdirectory.
|
|
||||||
#Therefore, we must append this subdirectory into PYTHONPATH.
|
|
||||||
#Only do this for the python directories matching the following:
|
|
||||||
foreach(pydir ${GR_TEST_PYTHON_DIRS})
|
|
||||||
get_filename_component(name ${pydir} NAME)
|
|
||||||
if(name MATCHES "^(swig|lib|src)$")
|
|
||||||
list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
|
|
||||||
endif()
|
|
||||||
endforeach(pydir)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
|
|
||||||
file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
|
|
||||||
file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
|
|
||||||
|
|
||||||
set(environs "VOLK_GENERIC=1" "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
|
|
||||||
list(APPEND environs ${GR_TEST_ENVIRONS})
|
|
||||||
|
|
||||||
#http://www.cmake.org/pipermail/cmake/2009-May/029464.html
|
|
||||||
#Replaced this add test + set environs code with the shell script generation.
|
|
||||||
#Its nicer to be able to manually run the shell script to diagnose problems.
|
|
||||||
#ADD_TEST(${ARGV})
|
|
||||||
#SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
|
|
||||||
|
|
||||||
if(UNIX)
|
|
||||||
set(LD_PATH_VAR "LD_LIBRARY_PATH")
|
|
||||||
if(APPLE)
|
|
||||||
set(LD_PATH_VAR "DYLD_LIBRARY_PATH")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
|
|
||||||
list(APPEND libpath "$${LD_PATH_VAR}")
|
|
||||||
list(APPEND pypath "$PYTHONPATH")
|
|
||||||
|
|
||||||
#replace list separator with the path separator
|
|
||||||
string(REPLACE ";" ":" libpath "${libpath}")
|
|
||||||
string(REPLACE ";" ":" pypath "${pypath}")
|
|
||||||
list(APPEND environs "PATH=${binpath}" "${LD_PATH_VAR}=${libpath}" "PYTHONPATH=${pypath}")
|
|
||||||
|
|
||||||
#generate a bat file that sets the environment and runs the test
|
|
||||||
if (CMAKE_CROSSCOMPILING)
|
|
||||||
set(SHELL "/bin/sh")
|
|
||||||
else(CMAKE_CROSSCOMPILING)
|
|
||||||
find_program(SHELL sh)
|
|
||||||
endif(CMAKE_CROSSCOMPILING)
|
|
||||||
set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
|
|
||||||
file(WRITE ${sh_file} "#!${SHELL}\n")
|
|
||||||
#each line sets an environment variable
|
|
||||||
foreach(environ ${environs})
|
|
||||||
file(APPEND ${sh_file} "export ${environ}\n")
|
|
||||||
endforeach(environ)
|
|
||||||
#load the command to run with its arguments
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
file(APPEND ${sh_file} "${arg} ")
|
|
||||||
endforeach(arg)
|
|
||||||
file(APPEND ${sh_file} "\n")
|
|
||||||
|
|
||||||
#make the shell file executable
|
|
||||||
execute_process(COMMAND chmod +x ${sh_file})
|
|
||||||
|
|
||||||
add_test(${test_name} ${SHELL} ${sh_file})
|
|
||||||
|
|
||||||
endif(UNIX)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
list(APPEND libpath ${DLL_PATHS} "%PATH%")
|
|
||||||
list(APPEND pypath "%PYTHONPATH%")
|
|
||||||
|
|
||||||
#replace list separator with the path separator (escaped)
|
|
||||||
string(REPLACE ";" "\\;" libpath "${libpath}")
|
|
||||||
string(REPLACE ";" "\\;" pypath "${pypath}")
|
|
||||||
list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
|
|
||||||
|
|
||||||
#generate a bat file that sets the environment and runs the test
|
|
||||||
set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
|
|
||||||
file(WRITE ${bat_file} "@echo off\n")
|
|
||||||
#each line sets an environment variable
|
|
||||||
foreach(environ ${environs})
|
|
||||||
file(APPEND ${bat_file} "SET ${environ}\n")
|
|
||||||
endforeach(environ)
|
|
||||||
#load the command to run with its arguments
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
file(APPEND ${bat_file} "${arg} ")
|
|
||||||
endforeach(arg)
|
|
||||||
file(APPEND ${bat_file} "\n")
|
|
||||||
|
|
||||||
add_test(${test_name} ${bat_file})
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
endfunction(GR_ADD_TEST)
|
|
|
@ -1,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 "${CMAKE_COMMAND}" -E touch_nocreate "${swig_gen_file}"
|
|
||||||
DEPENDS ${_target}
|
|
||||||
COMMENT "dummy command to show ${_target} dependency of ${swig_gen_file}"
|
|
||||||
)
|
|
||||||
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()
|
|
|
@ -24,7 +24,8 @@ FIND_LIBRARY(
|
||||||
/usr/lib64
|
/usr/lib64
|
||||||
)
|
)
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/hamnet70Target.cmake")
|
||||||
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(HAMNET70 DEFAULT_MSG HAMNET70_LIBRARIES HAMNET70_INCLUDE_DIRS)
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(HAMNET70 DEFAULT_MSG HAMNET70_LIBRARIES HAMNET70_INCLUDE_DIRS)
|
||||||
MARK_AS_ADVANCED(HAMNET70_LIBRARIES HAMNET70_INCLUDE_DIRS)
|
MARK_AS_ADVANCED(HAMNET70_LIBRARIES HAMNET70_INCLUDE_DIRS)
|
||||||
|
|
||||||
|
|
26
gr-hamnet70/cmake/Modules/targetConfig.cmake.in
Normal file
26
gr-hamnet70/cmake/Modules/targetConfig.cmake.in
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Copyright 2018 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(CMakeFindDependencyMacro)
|
||||||
|
|
||||||
|
set(target_deps "@TARGET_DEPENDENCIES@")
|
||||||
|
foreach(dep IN LISTS target_deps)
|
||||||
|
find_dependency(${dep})
|
||||||
|
endforeach()
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/@TARGET@Targets.cmake")
|
|
@ -654,8 +654,8 @@ WARN_LOGFILE =
|
||||||
# directories like "/usr/src/myproject". Separate the files or directories
|
# directories like "/usr/src/myproject". Separate the files or directories
|
||||||
# with spaces.
|
# with spaces.
|
||||||
|
|
||||||
INPUT = @top_srcdir@ \
|
INPUT = "@top_srcdir@" \
|
||||||
@top_builddir@
|
"@top_builddir@"
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
||||||
|
@ -790,7 +790,7 @@ INPUT_FILTER =
|
||||||
# info on how filters are used. If FILTER_PATTERNS is empty or if
|
# info on how filters are used. If FILTER_PATTERNS is empty or if
|
||||||
# non of the patterns match the file name, INPUT_FILTER is applied.
|
# non of the patterns match the file name, INPUT_FILTER is applied.
|
||||||
|
|
||||||
FILTER_PATTERNS = *.py=@top_srcdir@/doc/doxygen/other/doxypy.py
|
FILTER_PATTERNS = *.py="@top_srcdir@"/doc/doxygen/other/doxypy.py
|
||||||
|
|
||||||
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
|
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
|
||||||
# INPUT_FILTER) will be used to filter the input files when producing source
|
# INPUT_FILTER) will be used to filter the input files when producing source
|
||||||
|
|
|
@ -54,7 +54,7 @@ PROJECT_LOGO =
|
||||||
# If a relative path is entered, it will be relative to the location
|
# If a relative path is entered, it will be relative to the location
|
||||||
# where doxygen was started. If left blank the current directory will be used.
|
# where doxygen was started. If left blank the current directory will be used.
|
||||||
|
|
||||||
OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@
|
OUTPUT_DIRECTORY = "@OUTPUT_DIRECTORY@"
|
||||||
|
|
||||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
|
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
|
||||||
# 4096 sub-directories (in 2 levels) under the output directory of each output
|
# 4096 sub-directories (in 2 levels) under the output directory of each output
|
||||||
|
|
|
@ -64,8 +64,9 @@ This line is uninformative and is only to test line breaks in the comments.
|
||||||
u'Outputs the vital aadvark statistics.'
|
u'Outputs the vital aadvark statistics.'
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -25,24 +25,26 @@ A base class is created.
|
||||||
Classes based upon this are used to make more user-friendly interfaces
|
Classes based upon this are used to make more user-friendly interfaces
|
||||||
to the doxygen xml docs than the generated classes provide.
|
to the doxygen xml docs than the generated classes provide.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import pdb
|
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):
|
||||||
|
@ -95,7 +97,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):
|
||||||
|
@ -103,11 +105,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):
|
||||||
|
|
|
@ -23,12 +23,14 @@
|
||||||
Classes providing more user-friendly interfaces to the doxygen xml
|
Classes providing more user-friendly interfaces to the doxygen xml
|
||||||
docs than the generated classes provide.
|
docs than the generated classes provide.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -5,3 +5,4 @@ These do the real work of parsing the doxygen xml files but the
|
||||||
resultant classes are not very friendly to navigate so the rest of the
|
resultant classes are not very friendly to navigate so the rest of the
|
||||||
doxyxml module processes them further.
|
doxyxml module processes them further.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
|
@ -3,15 +3,17 @@
|
||||||
"""
|
"""
|
||||||
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|
||||||
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):
|
||||||
|
|
|
@ -4,12 +4,17 @@
|
||||||
# Generated Thu Jun 11 18:44:25 2009 by generateDS.py.
|
# Generated Thu Jun 11 18:44:25 2009 by generateDS.py.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# User methods
|
# User methods
|
||||||
#
|
#
|
||||||
|
@ -19,9 +24,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 +69,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, six.string_types) and inStr or
|
||||||
'%s' % inStr)
|
'%s' % inStr)
|
||||||
s1 = s1.replace('&', '&')
|
s1 = s1.replace('&', '&')
|
||||||
s1 = s1.replace('<', '<')
|
s1 = s1.replace('<', '<')
|
||||||
|
@ -72,7 +77,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, six.string_types) and inStr or
|
||||||
'%s' % inStr)
|
'%s' % inStr)
|
||||||
s1 = s1.replace('&', '&')
|
s1 = s1.replace('&', '&')
|
||||||
s1 = s1.replace('<', '<')
|
s1 = s1.replace('<', '<')
|
||||||
|
@ -102,7 +107,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 +4226,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 +4509,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 +4632,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 +6783,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 +7113,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 +8288,7 @@ Options:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print USAGE_TEXT
|
print(USAGE_TEXT)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -8339,4 +8344,3 @@ if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
#import pdb
|
#import pdb
|
||||||
#pdb.run('main()')
|
#pdb.run('main()')
|
||||||
|
|
||||||
|
|
|
@ -3,14 +3,16 @@
|
||||||
"""
|
"""
|
||||||
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from xml.dom import minidom
|
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):
|
||||||
|
|
|
@ -4,12 +4,16 @@
|
||||||
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
|
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
#
|
#
|
||||||
# User methods
|
# User methods
|
||||||
#
|
#
|
||||||
|
@ -19,9 +23,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 +68,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, six.string_types) and inStr or
|
||||||
'%s' % inStr)
|
'%s' % inStr)
|
||||||
s1 = s1.replace('&', '&')
|
s1 = s1.replace('&', '&')
|
||||||
s1 = s1.replace('<', '<')
|
s1 = s1.replace('<', '<')
|
||||||
|
@ -72,7 +76,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, six.string_types) and inStr or
|
||||||
'%s' % inStr)
|
'%s' % inStr)
|
||||||
s1 = s1.replace('&', '&')
|
s1 = s1.replace('&', '&')
|
||||||
s1 = s1.replace('<', '<')
|
s1 = s1.replace('<', '<')
|
||||||
|
@ -102,7 +106,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 +466,7 @@ Options:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print USAGE_TEXT
|
print(USAGE_TEXT)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -520,4 +524,3 @@ if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
#import pdb
|
#import pdb
|
||||||
#pdb.run('main()')
|
#pdb.run('main()')
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,13 @@
|
||||||
"""
|
"""
|
||||||
Utilities for extracting text from generated classes.
|
Utilities for extracting text from generated classes.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
def is_string(txt):
|
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
|
||||||
|
@ -50,7 +51,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"
|
||||||
|
|
|
@ -27,6 +27,7 @@ The file instructs SWIG to transfer the doxygen comments into the
|
||||||
python docstrings.
|
python docstrings.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import sys, time
|
import sys, time
|
||||||
|
|
||||||
|
@ -80,13 +81,15 @@ class Block2(object):
|
||||||
|
|
||||||
def utoascii(text):
|
def utoascii(text):
|
||||||
"""
|
"""
|
||||||
Convert unicode text into ascii and escape quotes.
|
Convert unicode text into ascii and escape quotes and backslashes.
|
||||||
"""
|
"""
|
||||||
if text is None:
|
if text is None:
|
||||||
return ''
|
return ''
|
||||||
out = text.encode('ascii', 'replace')
|
out = text.encode('ascii', 'replace')
|
||||||
out = out.replace('"', '\\"')
|
# swig will require us to replace blackslash with 4 backslashes
|
||||||
return out
|
out = out.replace(b'\\', b'\\\\\\\\')
|
||||||
|
out = out.replace(b'"', b'\\"').decode('ascii')
|
||||||
|
return str(out)
|
||||||
|
|
||||||
|
|
||||||
def combine_descriptions(obj):
|
def combine_descriptions(obj):
|
||||||
|
@ -302,7 +305,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None):
|
||||||
|
|
||||||
output = "\n\n".join(output)
|
output = "\n\n".join(output)
|
||||||
|
|
||||||
swig_doc = file(swigdocfilename, 'w')
|
swig_doc = open(swigdocfilename, 'w')
|
||||||
swig_doc.write(output)
|
swig_doc.write(output)
|
||||||
swig_doc.close()
|
swig_doc.close()
|
||||||
|
|
||||||
|
@ -310,7 +313,7 @@ if __name__ == "__main__":
|
||||||
# Parse command line options and set up doxyxml.
|
# Parse command line options and set up doxyxml.
|
||||||
err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
|
err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
|
||||||
if len(sys.argv) != 3:
|
if len(sys.argv) != 3:
|
||||||
raise StandardError(err_msg)
|
raise Exception(err_msg)
|
||||||
xml_path = sys.argv[1]
|
xml_path = sys.argv[1]
|
||||||
swigdocfilename = sys.argv[2]
|
swigdocfilename = sys.argv[2]
|
||||||
di = DoxyIndex(xml_path)
|
di = DoxyIndex(xml_path)
|
||||||
|
|
|
@ -18,14 +18,15 @@
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
# Boston, MA 02110-1301, USA.
|
# Boston, MA 02110-1301, USA.
|
||||||
install(FILES
|
install(FILES
|
||||||
hamnet70_correct_phase_from_tag.xml
|
hamnet70_correct_phase_from_tag.block.yml
|
||||||
hamnet70_correct_frequency.xml
|
hamnet70_correct_frequency.block.yml
|
||||||
hamnet70_freq_est_lr.xml
|
hamnet70_freq_est_lr.block.yml
|
||||||
hamnet70_pid_controller.xml
|
hamnet70_pid_controller.block.yml
|
||||||
hamnet70_insert_delayed_tag.xml
|
hamnet70_insert_delayed_tag.block.yml
|
||||||
hamnet70_scrambler.xml
|
hamnet70_scrambler.block.yml
|
||||||
hamnet70_async_scrambler.xml
|
hamnet70_async_scrambler.block.yml
|
||||||
hamnet70_insert_pilot_symbols.xml
|
hamnet70_insert_pilot_symbols.block.yml
|
||||||
hamnet70_correct_frequency_from_pilot_syms.xml
|
hamnet70_correct_frequency_from_pilot_syms.block.yml
|
||||||
hamnet70_symbol_interleaver.xml DESTINATION share/gnuradio/grc/blocks
|
hamnet70_symbol_interleaver.block.yml
|
||||||
|
hamnet70_qam_phase_tracker.block.yml DESTINATION share/gnuradio/grc/blocks
|
||||||
)
|
)
|
||||||
|
|
27
gr-hamnet70/grc/hamnet70_async_scrambler.block.yml
Normal file
27
gr-hamnet70/grc/hamnet70_async_scrambler.block.yml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_async_scrambler
|
||||||
|
label: Async Scrambler
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: start
|
||||||
|
label: Start Value
|
||||||
|
dtype: int
|
||||||
|
- id: polynom
|
||||||
|
label: Polynom
|
||||||
|
dtype: int
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: message
|
||||||
|
id: pdu_in
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: pdu_out
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.async_scrambler(${start}, ${polynom})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,30 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Async Scrambler</name>
|
|
||||||
<key>hamnet70_async_scrambler</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.async_scrambler($start, $polynom)</make>
|
|
||||||
<param>
|
|
||||||
<name>Start Value</name>
|
|
||||||
<key>start</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>0xFF</value-->
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Polynom</name>
|
|
||||||
<key>polynom</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>0x38</value-->
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>pdu_in</name>
|
|
||||||
<type>message</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>pdu_out</name>
|
|
||||||
<type>message</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
24
gr-hamnet70/grc/hamnet70_correct_frequency.block.yml
Normal file
24
gr-hamnet70/grc/hamnet70_correct_frequency.block.yml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_correct_frequency
|
||||||
|
label: Correct Frequency
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: symbols
|
||||||
|
label: Symbols
|
||||||
|
dtype: complex_vector
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.correct_frequency(${symbols})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Correct Frequency</name>
|
|
||||||
<key>hamnet70_correct_frequency</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.correct_frequency($symbols)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Symbols</name>
|
|
||||||
<key>symbols</key>
|
|
||||||
<type>complex_vector</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_correct_frequency_from_pilot_syms
|
||||||
|
label: Correct Frequency from Pilot Symbols
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: pilot_sequence
|
||||||
|
label: Pilot Sequence
|
||||||
|
dtype: complex_vector
|
||||||
|
- id: offsets
|
||||||
|
label: Insertion Positions
|
||||||
|
dtype: int_vector
|
||||||
|
- id: phase_ref_offset
|
||||||
|
label: Phase Reference Index
|
||||||
|
dtype: int
|
||||||
|
- id: start_tag
|
||||||
|
label: Start Tag Key
|
||||||
|
dtype: string
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.correct_frequency_from_pilot_syms(${pilot_sequence}, ${offsets},
|
||||||
|
${phase_ref_offset}, ${start_tag})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,38 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Correct Frequency from Pilot Symbols</name>
|
|
||||||
<key>hamnet70_correct_frequency_from_pilot_syms</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.correct_frequency_from_pilot_syms($pilot_sequence, $offsets, $phase_ref_offset, $start_tag)</make>
|
|
||||||
<param>
|
|
||||||
<name>Pilot Sequence</name>
|
|
||||||
<key>pilot_sequence</key>
|
|
||||||
<type>complex_vector</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Insertion Positions</name>
|
|
||||||
<key>offsets</key>
|
|
||||||
<type>int_vector</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Phase Reference Index</name>
|
|
||||||
<key>phase_ref_offset</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>0</value-->
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Start Tag Key</name>
|
|
||||||
<key>start_tag</key>
|
|
||||||
<type>string</type>
|
|
||||||
<!--value>corr_est</value-->
|
|
||||||
</param>
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
24
gr-hamnet70/grc/hamnet70_correct_phase_from_tag.block.yml
Normal file
24
gr-hamnet70/grc/hamnet70_correct_phase_from_tag.block.yml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_correct_phase_from_tag
|
||||||
|
label: correct_phase_from_tag
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: phase_tag_name
|
||||||
|
label: Phase Tag
|
||||||
|
dtype: string
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.correct_phase_from_tag(${phase_tag_name})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,38 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>correct_phase_from_tag</name>
|
|
||||||
<key>hamnet70_correct_phase_from_tag</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.correct_phase_from_tag($phase_tag_name)</make>
|
|
||||||
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
|
|
||||||
Sub-nodes:
|
|
||||||
* name
|
|
||||||
* key (makes the value accessible as $keyname, e.g. in the make node)
|
|
||||||
* type -->
|
|
||||||
<param>
|
|
||||||
<name>Phase Tag</name>
|
|
||||||
<key>phase_tag_name</key>
|
|
||||||
<type>string</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<!-- Make one 'sink' node per input. Sub-nodes:
|
|
||||||
* name (an identifier for the GUI)
|
|
||||||
* type
|
|
||||||
* vlen
|
|
||||||
* optional (set to 1 for optional inputs) -->
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<!-- Make one 'source' node per output. Sub-nodes:
|
|
||||||
* name (an identifier for the GUI)
|
|
||||||
* type
|
|
||||||
* vlen
|
|
||||||
* optional (set to 1 for optional inputs) -->
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
30
gr-hamnet70/grc/hamnet70_freq_est_lr.block.yml
Normal file
30
gr-hamnet70/grc/hamnet70_freq_est_lr.block.yml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_freq_est_lr
|
||||||
|
label: L&R Data-Aided Freq. Est.
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: symbols
|
||||||
|
label: Preamble Symbols
|
||||||
|
dtype: complex_vector
|
||||||
|
- id: kappa
|
||||||
|
label: Kappa
|
||||||
|
dtype: int
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: float
|
||||||
|
- domain: message
|
||||||
|
id: freq_offset
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.freq_est_lr(${symbols}, ${kappa})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,37 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>L&R Data-Aided Freq. Est.</name>
|
|
||||||
<key>hamnet70_freq_est_lr</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.freq_est_lr($symbols, $kappa)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Preamble Symbols</name>
|
|
||||||
<key>symbols</key>
|
|
||||||
<type>complex_vector</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Kappa</name>
|
|
||||||
<key>kappa</key>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>float</type>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>freq_offset</name>
|
|
||||||
<type>message</type>
|
|
||||||
<optional>1</optional>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
</block>
|
|
30
gr-hamnet70/grc/hamnet70_insert_delayed_tag.block.yml
Normal file
30
gr-hamnet70/grc/hamnet70_insert_delayed_tag.block.yml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_insert_delayed_tag
|
||||||
|
label: Insert Delayed Tag
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: trigger_tag
|
||||||
|
label: Trigger Tag Name
|
||||||
|
dtype: string
|
||||||
|
- id: insert_tag
|
||||||
|
label: Inserted Tag Name
|
||||||
|
dtype: string
|
||||||
|
- id: delay
|
||||||
|
label: Delay
|
||||||
|
dtype: int
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.insert_delayed_tag(${trigger_tag}, ${insert_tag}, ${delay})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,33 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Insert Delayed Tag</name>
|
|
||||||
<key>hamnet70_insert_delayed_tag</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.insert_delayed_tag($trigger_tag, $insert_tag, $delay)</make>
|
|
||||||
<param>
|
|
||||||
<name>Trigger Tag Name</name>
|
|
||||||
<key>trigger_tag</key>
|
|
||||||
<type>string</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Inserted Tag Name</name>
|
|
||||||
<key>insert_tag</key>
|
|
||||||
<type>string</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Delay</name>
|
|
||||||
<key>delay</key>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
30
gr-hamnet70/grc/hamnet70_insert_pilot_symbols.block.yml
Normal file
30
gr-hamnet70/grc/hamnet70_insert_pilot_symbols.block.yml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_insert_pilot_symbols
|
||||||
|
label: Insert Pilot Symbols
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: pilot_sequence
|
||||||
|
label: Pilot Sequence
|
||||||
|
dtype: complex_vector
|
||||||
|
- id: offsets
|
||||||
|
label: Insertion Positions
|
||||||
|
dtype: int_vector
|
||||||
|
- id: length_tag
|
||||||
|
label: Length Tag Key
|
||||||
|
dtype: string
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.insert_pilot_symbols(${pilot_sequence}, ${offsets}, ${length_tag})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,32 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Insert Pilot Symbols</name>
|
|
||||||
<key>hamnet70_insert_pilot_symbols</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.insert_pilot_symbols($pilot_sequence, $offsets, $length_tag)</make>
|
|
||||||
<param>
|
|
||||||
<name>Pilot Sequence</name>
|
|
||||||
<key>pilot_sequence</key>
|
|
||||||
<type>complex_vector</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Insertion Positions</name>
|
|
||||||
<key>offsets</key>
|
|
||||||
<type>int_vector</type>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Length Tag Key</name>
|
|
||||||
<key>length_tag</key>
|
|
||||||
<type>string</type>
|
|
||||||
<!--value>packet_len</value-->
|
|
||||||
</param>
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
41
gr-hamnet70/grc/hamnet70_pid_controller.block.yml
Normal file
41
gr-hamnet70/grc/hamnet70_pid_controller.block.yml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_pid_controller
|
||||||
|
label: PID Controller
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: interval
|
||||||
|
label: interval
|
||||||
|
dtype: int
|
||||||
|
default: '1'
|
||||||
|
- id: p
|
||||||
|
label: P Gain
|
||||||
|
dtype: float
|
||||||
|
default: '1.0'
|
||||||
|
- id: i
|
||||||
|
label: I Gain
|
||||||
|
dtype: float
|
||||||
|
default: '0.0'
|
||||||
|
- id: d
|
||||||
|
label: D Gain
|
||||||
|
dtype: float
|
||||||
|
default: '0.0'
|
||||||
|
- id: post_gain
|
||||||
|
label: Post Gain
|
||||||
|
dtype: float
|
||||||
|
default: '1.0'
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: float
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: message
|
||||||
|
id: control_value
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.pid_controller(${interval}, ${p}, ${i}, ${d}, ${post_gain})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,53 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>PID Controller</name>
|
|
||||||
<key>hamnet70_pid_controller</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.pid_controller($interval, $p, $i, $d, $post_gain)</make>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>interval</name>
|
|
||||||
<key>interval</key>
|
|
||||||
<value>1</value>
|
|
||||||
<type>int</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>P Gain</name>
|
|
||||||
<key>p</key>
|
|
||||||
<value>1.0</value>
|
|
||||||
<type>float</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>I Gain</name>
|
|
||||||
<key>i</key>
|
|
||||||
<value>0.0</value>
|
|
||||||
<type>float</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>D Gain</name>
|
|
||||||
<key>d</key>
|
|
||||||
<value>0.0</value>
|
|
||||||
<type>float</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<param>
|
|
||||||
<name>Post Gain</name>
|
|
||||||
<key>post_gain</key>
|
|
||||||
<value>1.0</value>
|
|
||||||
<type>float</type>
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>float</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>control_value</name>
|
|
||||||
<type>message</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
28
gr-hamnet70/grc/hamnet70_qam_phase_tracker.block.yml
Normal file
28
gr-hamnet70/grc/hamnet70_qam_phase_tracker.block.yml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
id: hamnet70_qam_phase_tracker
|
||||||
|
label: QAM Phase Tracker
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.qam_phase_tracker(${symbols}, ${alpha}, ${start_tag})
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: symbols
|
||||||
|
label: Constellation Symbols
|
||||||
|
dtype: complex_vector
|
||||||
|
- id: alpha
|
||||||
|
label: Alpha
|
||||||
|
dtype: float
|
||||||
|
- id: start_tag
|
||||||
|
label: Start Tag
|
||||||
|
dtype: string
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
file_format: 1
|
27
gr-hamnet70/grc/hamnet70_scrambler.block.yml
Normal file
27
gr-hamnet70/grc/hamnet70_scrambler.block.yml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_scrambler
|
||||||
|
label: Scrambler
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: start
|
||||||
|
label: Start Value
|
||||||
|
dtype: int
|
||||||
|
- id: polynom
|
||||||
|
label: Polynom
|
||||||
|
dtype: int
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: byte
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.scrambler(${start}, ${polynom})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,30 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Scrambler</name>
|
|
||||||
<key>hamnet70_scrambler</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.scrambler($start, $polynom)</make>
|
|
||||||
<param>
|
|
||||||
<name>Start Value</name>
|
|
||||||
<key>start</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>0xFF</value-->
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Polynom</name>
|
|
||||||
<key>polynom</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>0x38</value-->
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>byte</type>
|
|
||||||
</sink>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>byte</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
34
gr-hamnet70/grc/hamnet70_symbol_interleaver.block.yml
Normal file
34
gr-hamnet70/grc/hamnet70_symbol_interleaver.block.yml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# auto-generated by grc.converter
|
||||||
|
|
||||||
|
id: hamnet70_symbol_interleaver
|
||||||
|
label: Symbol (De-)Interleaver
|
||||||
|
category: '[hamnet70]'
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- id: interleaver_width
|
||||||
|
label: Memory width
|
||||||
|
dtype: int
|
||||||
|
- id: operation
|
||||||
|
label: Operation
|
||||||
|
dtype: enum
|
||||||
|
options: [interleave, deinterleave]
|
||||||
|
option_attributes:
|
||||||
|
deinterleave: ['False', 'True']
|
||||||
|
- id: length_tag
|
||||||
|
label: Length Tag Key
|
||||||
|
dtype: string
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- domain: stream
|
||||||
|
dtype: complex
|
||||||
|
|
||||||
|
templates:
|
||||||
|
imports: import hamnet70
|
||||||
|
make: hamnet70.symbol_interleaver(${interleaver_width}, ${operation.deinterleave},
|
||||||
|
${length_tag})
|
||||||
|
|
||||||
|
file_format: 1
|
|
@ -1,44 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<block>
|
|
||||||
<name>Symbol (De-)Interleaver</name>
|
|
||||||
<key>hamnet70_symbol_interleaver</key>
|
|
||||||
<category>[hamnet70]</category>
|
|
||||||
<import>import hamnet70</import>
|
|
||||||
<make>hamnet70.symbol_interleaver($interleaver_width, $operation.deinterleave, $length_tag)</make>
|
|
||||||
<param>
|
|
||||||
<name>Memory width</name>
|
|
||||||
<key>interleaver_width</key>
|
|
||||||
<type>int</type>
|
|
||||||
<!--value>packet_len</value-->
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Operation</name>
|
|
||||||
<key>operation</key>
|
|
||||||
<type>enum</type>
|
|
||||||
<option>
|
|
||||||
<name>Interleave</name>
|
|
||||||
<key>interleave</key>
|
|
||||||
<opt>deinterleave:False</opt>
|
|
||||||
</option>
|
|
||||||
<option>
|
|
||||||
<name>Deinterleave</name>
|
|
||||||
<key>deinterleave</key>
|
|
||||||
<opt>deinterleave:True</opt>
|
|
||||||
</option>
|
|
||||||
</param>
|
|
||||||
<param>
|
|
||||||
<name>Length Tag Key</name>
|
|
||||||
<key>length_tag</key>
|
|
||||||
<type>string</type>
|
|
||||||
<!--value>packet_len</value-->
|
|
||||||
</param>
|
|
||||||
|
|
||||||
<sink>
|
|
||||||
<name>in</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</sink>
|
|
||||||
<source>
|
|
||||||
<name>out</name>
|
|
||||||
<type>complex</type>
|
|
||||||
</source>
|
|
||||||
</block>
|
|
|
@ -32,5 +32,6 @@ install(FILES
|
||||||
async_scrambler.h
|
async_scrambler.h
|
||||||
insert_pilot_symbols.h
|
insert_pilot_symbols.h
|
||||||
correct_frequency_from_pilot_syms.h
|
correct_frequency_from_pilot_syms.h
|
||||||
symbol_interleaver.h DESTINATION include/hamnet70
|
symbol_interleaver.h
|
||||||
|
qam_phase_tracker.h DESTINATION include/hamnet70
|
||||||
)
|
)
|
||||||
|
|
55
gr-hamnet70/include/hamnet70/qam_phase_tracker.h
Normal file
55
gr-hamnet70/include/hamnet70/qam_phase_tracker.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Thomas Kolb.
|
||||||
|
*
|
||||||
|
* 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_HAMNET70_QAM_PHASE_TRACKER_H
|
||||||
|
#define INCLUDED_HAMNET70_QAM_PHASE_TRACKER_H
|
||||||
|
|
||||||
|
#include <hamnet70/api.h>
|
||||||
|
#include <gnuradio/sync_block.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace hamnet70 {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief <+description of block+>
|
||||||
|
* \ingroup hamnet70
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class HAMNET70_API qam_phase_tracker : virtual public gr::sync_block
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::shared_ptr<qam_phase_tracker> sptr;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Return a shared_ptr to a new instance of hamnet70::qam_phase_tracker.
|
||||||
|
*
|
||||||
|
* To avoid accidental use of raw pointers, hamnet70::qam_phase_tracker's
|
||||||
|
* constructor is in a private implementation
|
||||||
|
* class. hamnet70::qam_phase_tracker::make is the public interface for
|
||||||
|
* creating new instances.
|
||||||
|
*/
|
||||||
|
static sptr make(const std::vector<gr_complex> &symbols, float alpha, const std::string &start_tag);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace hamnet70
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_HAMNET70_QAM_PHASE_TRACKER_H */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright 2011,2012,2016 Free Software Foundation, Inc.
|
# Copyright 2011,2012,2016,2018,2019 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
# This file is a part of gr-hamnet70
|
# This file is a part of gr-hamnet70
|
||||||
|
@ -23,8 +23,6 @@
|
||||||
########################################################################
|
########################################################################
|
||||||
include(GrPlatform) #define LIB_SUFFIX
|
include(GrPlatform) #define LIB_SUFFIX
|
||||||
|
|
||||||
include_directories(${Boost_INCLUDE_DIR})
|
|
||||||
link_directories(${Boost_LIBRARY_DIRS})
|
|
||||||
list(APPEND hamnet70_sources
|
list(APPEND hamnet70_sources
|
||||||
correct_phase_from_tag_impl.cc
|
correct_phase_from_tag_impl.cc
|
||||||
correct_frequency_impl.cc
|
correct_frequency_impl.cc
|
||||||
|
@ -36,6 +34,7 @@ list(APPEND hamnet70_sources
|
||||||
insert_pilot_symbols_impl.cc
|
insert_pilot_symbols_impl.cc
|
||||||
correct_frequency_from_pilot_syms_impl.cc
|
correct_frequency_from_pilot_syms_impl.cc
|
||||||
symbol_interleaver_impl.cc
|
symbol_interleaver_impl.cc
|
||||||
|
qam_phase_tracker_impl.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
set(hamnet70_sources "${hamnet70_sources}" PARENT_SCOPE)
|
set(hamnet70_sources "${hamnet70_sources}" PARENT_SCOPE)
|
||||||
|
@ -45,7 +44,11 @@ if(NOT hamnet70_sources)
|
||||||
endif(NOT hamnet70_sources)
|
endif(NOT hamnet70_sources)
|
||||||
|
|
||||||
add_library(gnuradio-hamnet70 SHARED ${hamnet70_sources})
|
add_library(gnuradio-hamnet70 SHARED ${hamnet70_sources})
|
||||||
target_link_libraries(gnuradio-hamnet70 ${Boost_LIBRARIES} ${GNURADIO_ALL_LIBRARIES})
|
target_link_libraries(gnuradio-hamnet70 gnuradio::gnuradio-runtime)
|
||||||
|
target_include_directories(gnuradio-hamnet70
|
||||||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>
|
||||||
|
PUBLIC $<INSTALL_INTERFACE:include>
|
||||||
|
)
|
||||||
set_target_properties(gnuradio-hamnet70 PROPERTIES DEFINE_SYMBOL "gnuradio_hamnet70_EXPORTS")
|
set_target_properties(gnuradio-hamnet70 PROPERTIES DEFINE_SYMBOL "gnuradio_hamnet70_EXPORTS")
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
@ -58,31 +61,7 @@ endif(APPLE)
|
||||||
# Install built library files
|
# Install built library files
|
||||||
########################################################################
|
########################################################################
|
||||||
include(GrMiscUtils)
|
include(GrMiscUtils)
|
||||||
GR_LIBRARY_FOO(gnuradio-hamnet70 RUNTIME_COMPONENT "hamnet70_runtime" DEVEL_COMPONENT "hamnet70_devel")
|
GR_LIBRARY_FOO(gnuradio-hamnet70)
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Build and register unit test
|
|
||||||
########################################################################
|
|
||||||
include(GrTest)
|
|
||||||
|
|
||||||
include_directories(${CPPUNIT_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
list(APPEND test_hamnet70_sources
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/test_hamnet70.cc
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/qa_hamnet70.cc
|
|
||||||
)
|
|
||||||
|
|
||||||
add_executable(test-hamnet70 ${test_hamnet70_sources})
|
|
||||||
|
|
||||||
target_link_libraries(
|
|
||||||
test-hamnet70
|
|
||||||
${GNURADIO_RUNTIME_LIBRARIES}
|
|
||||||
${Boost_LIBRARIES}
|
|
||||||
${CPPUNIT_LIBRARIES}
|
|
||||||
gnuradio-hamnet70
|
|
||||||
)
|
|
||||||
|
|
||||||
#GR_ADD_TEST(test_hamnet70 test-hamnet70)
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Print summary
|
# Print summary
|
||||||
|
@ -90,3 +69,26 @@ target_link_libraries(
|
||||||
message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
|
message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||||
message(STATUS "Building for version: ${VERSION} / ${LIBVER}")
|
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_hamnet70_sources
|
||||||
|
)
|
||||||
|
# Anything we need to link to for the unit tests go here
|
||||||
|
list(APPEND GR_TEST_TARGET_DEPS gnuradio-hamnet70)
|
||||||
|
|
||||||
|
if(NOT test_hamnet70_sources)
|
||||||
|
MESSAGE(STATUS "No C++ unit tests... skipping")
|
||||||
|
return()
|
||||||
|
endif(NOT test_hamnet70_sources)
|
||||||
|
|
||||||
|
foreach(qa_file ${test_hamnet70_sources})
|
||||||
|
GR_ADD_CPP_TEST("hamnet70_${qa_file}"
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${qa_file}
|
||||||
|
)
|
||||||
|
endforeach(qa_file)
|
||||||
|
|
|
@ -44,7 +44,8 @@ namespace gr {
|
||||||
gr::io_signature::make(1, 1, sizeof(gr_complex)),
|
gr::io_signature::make(1, 1, sizeof(gr_complex)),
|
||||||
gr::io_signature::make(1, 1, sizeof(float))),
|
gr::io_signature::make(1, 1, sizeof(float))),
|
||||||
d_refSymbols(symbols),
|
d_refSymbols(symbols),
|
||||||
d_kappa(kappa)
|
d_kappa(kappa),
|
||||||
|
d_freq_est(0.0f)
|
||||||
{
|
{
|
||||||
d_recvSymbols.reserve(symbols.size() + 1);
|
d_recvSymbols.reserve(symbols.size() + 1);
|
||||||
|
|
||||||
|
|
132
gr-hamnet70/lib/qam_phase_tracker_impl.cc
Normal file
132
gr-hamnet70/lib/qam_phase_tracker_impl.cc
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Thomas Kolb.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <gnuradio/expj.h>
|
||||||
|
#include <gnuradio/math.h>
|
||||||
|
#include "qam_phase_tracker_impl.h"
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace hamnet70 {
|
||||||
|
|
||||||
|
qam_phase_tracker::sptr
|
||||||
|
qam_phase_tracker::make(const std::vector<gr_complex> &symbols, float alpha, const std::string &start_tag)
|
||||||
|
{
|
||||||
|
return gnuradio::get_initial_sptr
|
||||||
|
(new qam_phase_tracker_impl(symbols, alpha, start_tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The private constructor
|
||||||
|
*/
|
||||||
|
qam_phase_tracker_impl::qam_phase_tracker_impl(const std::vector<gr_complex> &symbols, float alpha, const std::string &start_tag)
|
||||||
|
: gr::sync_block("qam_phase_tracker",
|
||||||
|
gr::io_signature::make(1, 1, sizeof(gr_complex)),
|
||||||
|
gr::io_signature::make(1, 1, sizeof(gr_complex))),
|
||||||
|
d_alpha(alpha),
|
||||||
|
d_startTag(pmt::intern(start_tag)),
|
||||||
|
d_avgPhaseOffset(0.0f)
|
||||||
|
{
|
||||||
|
// use only symbols in the upper right quadrant
|
||||||
|
for(auto s : symbols) {
|
||||||
|
if(s.real() >= 0 && s.imag() >= 0) {
|
||||||
|
d_refSymbols.push_back(s);
|
||||||
|
d_refPhase.push_back(gr::fast_atan2f(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Our virtual destructor.
|
||||||
|
*/
|
||||||
|
qam_phase_tracker_impl::~qam_phase_tracker_impl()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
qam_phase_tracker_impl::work(int noutput_items,
|
||||||
|
gr_vector_const_void_star &input_items,
|
||||||
|
gr_vector_void_star &output_items)
|
||||||
|
{
|
||||||
|
const gr_complex *in = (const gr_complex *) input_items[0];
|
||||||
|
gr_complex *out = (gr_complex *) output_items[0];
|
||||||
|
|
||||||
|
for(int i = 0; i < noutput_items; i++) {
|
||||||
|
out[i] = in[i] * gr_expj(-d_avgPhaseOffset);
|
||||||
|
|
||||||
|
std::vector<tag_t> tags;
|
||||||
|
get_tags_in_window(tags, 0, i, i+1, d_startTag);
|
||||||
|
|
||||||
|
if(tags.size() > 0) {
|
||||||
|
// start tag found on this item -> reset average
|
||||||
|
d_avgPhaseOffset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update average phase offset from current symbol
|
||||||
|
|
||||||
|
gr_complex rotated = out[i];
|
||||||
|
|
||||||
|
float re = rotated.real();
|
||||||
|
float im = rotated.imag();
|
||||||
|
|
||||||
|
// normalize to positive quadrant
|
||||||
|
if(re < 0 && im > 0) {
|
||||||
|
rotated *= gr_expj(-M_PI/2);
|
||||||
|
} else if(re < 0 && im < 0) {
|
||||||
|
rotated *= -1;
|
||||||
|
} else if(im < 0) { // && re > 0
|
||||||
|
rotated *= gr_expj(M_PI/2);
|
||||||
|
} // else already ok
|
||||||
|
|
||||||
|
// find closest reference symbol
|
||||||
|
float min_dist = 1e9;
|
||||||
|
size_t closest_idx;
|
||||||
|
|
||||||
|
for(size_t r = 0; r < d_refSymbols.size(); r++) {
|
||||||
|
float d = std::norm(d_refSymbols[r] - rotated);
|
||||||
|
|
||||||
|
if(d < min_dist) {
|
||||||
|
closest_idx = r;
|
||||||
|
min_dist = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float phase = gr::fast_atan2f(rotated);
|
||||||
|
float delta_phase = phase - d_refPhase[closest_idx];
|
||||||
|
|
||||||
|
if(delta_phase > M_PI/4 || delta_phase < -M_PI/4) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
d_avgPhaseOffset += d_alpha * delta_phase;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tell runtime system how many output items we produced.
|
||||||
|
return noutput_items;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace hamnet70 */
|
||||||
|
} /* namespace gr */
|
||||||
|
|
54
gr-hamnet70/lib/qam_phase_tracker_impl.h
Normal file
54
gr-hamnet70/lib/qam_phase_tracker_impl.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Thomas Kolb.
|
||||||
|
*
|
||||||
|
* 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_HAMNET70_QAM_PHASE_TRACKER_IMPL_H
|
||||||
|
#define INCLUDED_HAMNET70_QAM_PHASE_TRACKER_IMPL_H
|
||||||
|
|
||||||
|
#include <hamnet70/qam_phase_tracker.h>
|
||||||
|
|
||||||
|
namespace gr {
|
||||||
|
namespace hamnet70 {
|
||||||
|
|
||||||
|
class qam_phase_tracker_impl : public qam_phase_tracker
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
pmt::pmt_t d_startTag;
|
||||||
|
float d_alpha;
|
||||||
|
float d_avgPhaseOffset;
|
||||||
|
std::vector<gr_complex> d_refSymbols;
|
||||||
|
std::vector<float> d_refPhase;
|
||||||
|
|
||||||
|
public:
|
||||||
|
qam_phase_tracker_impl(const std::vector<gr_complex> &symbols, float alpha, const std::string &start_tag);
|
||||||
|
~qam_phase_tracker_impl();
|
||||||
|
|
||||||
|
// Where all the action really happens
|
||||||
|
int work(
|
||||||
|
int noutput_items,
|
||||||
|
gr_vector_const_void_star &input_items,
|
||||||
|
gr_vector_void_star &output_items
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace hamnet70
|
||||||
|
} // namespace gr
|
||||||
|
|
||||||
|
#endif /* INCLUDED_HAMNET70_QAM_PHASE_TRACKER_IMPL_H */
|
||||||
|
|
|
@ -75,8 +75,10 @@ namespace gr {
|
||||||
size_t nfullcols = nitems % d_width;
|
size_t nfullcols = nitems % d_width;
|
||||||
|
|
||||||
size_t nrows = nitems / d_width;
|
size_t nrows = nitems / d_width;
|
||||||
if(nitems % nrows != 0) {
|
if(nfullcols != 0) {
|
||||||
nrows++;
|
nrows++;
|
||||||
|
} else {
|
||||||
|
nfullcols = ncols;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t row = 0;
|
size_t row = 0;
|
||||||
|
|
|
@ -4,8 +4,9 @@ set -e
|
||||||
|
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake ..
|
#cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
|
||||||
make -j4
|
cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
make -j$(ls -d1 /sys/devices/system/cpu/cpu[0-9]* | wc -l)
|
||||||
|
|
||||||
if [ "$1" == "install" ]; then
|
if [ "$1" == "install" ]; then
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
|
@ -52,3 +52,4 @@ set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
|
||||||
#GR_ADD_TEST(qa_insert_pilot_symbols ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_insert_pilot_symbols.py)
|
#GR_ADD_TEST(qa_insert_pilot_symbols ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_insert_pilot_symbols.py)
|
||||||
#GR_ADD_TEST(qa_correct_frequency_from_pilot_syms ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_correct_frequency_from_pilot_syms.py)
|
#GR_ADD_TEST(qa_correct_frequency_from_pilot_syms ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_correct_frequency_from_pilot_syms.py)
|
||||||
#GR_ADD_TEST(qa_symbol_interleaver ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_symbol_interleaver.py)
|
#GR_ADD_TEST(qa_symbol_interleaver ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_symbol_interleaver.py)
|
||||||
|
GR_ADD_TEST(qa_qam_phase_tracker ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_qam_phase_tracker.py)
|
||||||
|
|
|
@ -22,15 +22,14 @@
|
||||||
This is the GNU Radio HAMNET70 module. Place your Python package
|
This is the GNU Radio HAMNET70 module. Place your Python package
|
||||||
description here (python/__init__.py).
|
description here (python/__init__.py).
|
||||||
'''
|
'''
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
## import swig generated symbols into the hamnet70 namespace
|
# import swig generated symbols into the hamnet70 namespace
|
||||||
#try:
|
try:
|
||||||
# # this might fail if the module is python-only
|
# this might fail if the module is python-only
|
||||||
# from hamnet70_swig import *
|
from .hamnet70_swig import *
|
||||||
#except ImportError:
|
except ImportError:
|
||||||
# pass
|
pass
|
||||||
|
|
||||||
from hamnet70_swig import *
|
|
||||||
|
|
||||||
# import any pure python here
|
# import any pure python here
|
||||||
#
|
#
|
||||||
|
|
41
gr-hamnet70/python/qa_qam_phase_tracker.py
Executable file
41
gr-hamnet70/python/qa_qam_phase_tracker.py
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright 2019 Thomas Kolb.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
from gnuradio import gr, gr_unittest
|
||||||
|
from gnuradio import blocks
|
||||||
|
import hamnet70_swig as hamnet70
|
||||||
|
|
||||||
|
class qa_qam_phase_tracker(gr_unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.tb = gr.top_block()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.tb = None
|
||||||
|
|
||||||
|
def test_001_t(self):
|
||||||
|
# set up fg
|
||||||
|
self.tb.run()
|
||||||
|
# check data
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
gr_unittest.run(qa_qam_phase_tracker)
|
|
@ -30,7 +30,7 @@ endif(NOT hamnet70_sources)
|
||||||
# Include swig generation macros
|
# Include swig generation macros
|
||||||
########################################################################
|
########################################################################
|
||||||
find_package(SWIG)
|
find_package(SWIG)
|
||||||
find_package(PythonLibs 2)
|
find_package(PythonLibs)
|
||||||
if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
|
if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
@ -40,11 +40,11 @@ include(GrPython)
|
||||||
########################################################################
|
########################################################################
|
||||||
# Setup swig generation
|
# Setup swig generation
|
||||||
########################################################################
|
########################################################################
|
||||||
foreach(incdir ${GNURADIO_RUNTIME_INCLUDE_DIRS})
|
set(GR_SWIG_INCLUDE_DIRS $<TARGET_PROPERTY:gnuradio::runtime_swig,INTERFACE_INCLUDE_DIRECTORIES>)
|
||||||
list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gnuradio/swig)
|
set(GR_SWIG_TARGET_DEPS gnuradio::runtime_swig)
|
||||||
endforeach(incdir)
|
|
||||||
|
|
||||||
set(GR_SWIG_LIBRARIES gnuradio-hamnet70)
|
set(GR_SWIG_LIBRARIES gnuradio-hamnet70)
|
||||||
|
|
||||||
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/hamnet70_swig_doc.i)
|
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/hamnet70_swig_doc.i)
|
||||||
set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "hamnet70/insert_pilot_symbols.h"
|
#include "hamnet70/insert_pilot_symbols.h"
|
||||||
#include "hamnet70/correct_frequency_from_pilot_syms.h"
|
#include "hamnet70/correct_frequency_from_pilot_syms.h"
|
||||||
#include "hamnet70/symbol_interleaver.h"
|
#include "hamnet70/symbol_interleaver.h"
|
||||||
|
#include "hamnet70/qam_phase_tracker.h"
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,3 +43,5 @@ GR_SWIG_BLOCK_MAGIC2(hamnet70, insert_pilot_symbols);
|
||||||
GR_SWIG_BLOCK_MAGIC2(hamnet70, correct_frequency_from_pilot_syms);
|
GR_SWIG_BLOCK_MAGIC2(hamnet70, correct_frequency_from_pilot_syms);
|
||||||
%include "hamnet70/symbol_interleaver.h"
|
%include "hamnet70/symbol_interleaver.h"
|
||||||
GR_SWIG_BLOCK_MAGIC2(hamnet70, symbol_interleaver);
|
GR_SWIG_BLOCK_MAGIC2(hamnet70, symbol_interleaver);
|
||||||
|
%include "hamnet70/qam_phase_tracker.h"
|
||||||
|
GR_SWIG_BLOCK_MAGIC2(hamnet70, qam_phase_tracker);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
1728
grc/hamnet70_mod.grc
1728
grc/hamnet70_mod.grc
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,20 @@
|
||||||
zypper install \
|
zypper install \
|
||||||
libboost_system-devel \
|
libboost_system-devel \
|
||||||
libboost_filesystem-devel \
|
libboost_filesystem-devel \
|
||||||
|
libboost_thread-devel \
|
||||||
|
libboost_regex-devel \
|
||||||
|
libboost_program_options-devel \
|
||||||
|
libboost_date_time-devel \
|
||||||
|
libboost_test-devel \
|
||||||
|
libboost_atomic-devel \
|
||||||
swig \
|
swig \
|
||||||
cppunit-devel \
|
cppunit-devel \
|
||||||
gnuradio-devel \
|
gnuradio-devel \
|
||||||
python-devel \
|
python-devel \
|
||||||
cmake \
|
cmake \
|
||||||
gcc-c++ \
|
gcc-c++ \
|
||||||
|
orc \
|
||||||
|
python3-pyaml \
|
||||||
|
gobject-introspection \
|
||||||
|
typelib-1_0-Gtk-3_0 \
|
||||||
|
|
||||||
|
|
3419
tmp/test_sc16qam.grc
3419
tmp/test_sc16qam.grc
File diff suppressed because it is too large
Load diff
324
tmp/test_trx_over_udp.grc
Normal file
324
tmp/test_trx_over_udp.grc
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
options:
|
||||||
|
parameters:
|
||||||
|
author: ''
|
||||||
|
category: '[GRC Hier Blocks]'
|
||||||
|
cmake_opt: ''
|
||||||
|
comment: ''
|
||||||
|
copyright: ''
|
||||||
|
description: ''
|
||||||
|
gen_cmake: 'On'
|
||||||
|
gen_linking: dynamic
|
||||||
|
generate_options: qt_gui
|
||||||
|
hier_block_src_path: '.:'
|
||||||
|
id: rf_trx_over_udp
|
||||||
|
max_nouts: '0'
|
||||||
|
output_language: python
|
||||||
|
placement: (0,0)
|
||||||
|
qt_qss_theme: ''
|
||||||
|
realtime_scheduling: ''
|
||||||
|
run: 'True'
|
||||||
|
run_command: '{python} -u {filename}'
|
||||||
|
run_options: prompt
|
||||||
|
sizing_mode: fixed
|
||||||
|
thread_safe_setters: ''
|
||||||
|
title: ''
|
||||||
|
window_size: (1500,800)
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [8, 8]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
|
||||||
|
blocks:
|
||||||
|
- name: MTU
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: '1000'
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [375, 11]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: center_freq
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: 434.1e6
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [862, 11]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: device
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: '"soapy=0,driver=hackrf"'
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [591, 11]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: io_rate
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: 2.4e6
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [758, 11]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: offset_freq
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: 200e3
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [960, 16]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: samp_rate
|
||||||
|
id: variable
|
||||||
|
parameters:
|
||||||
|
comment: ''
|
||||||
|
value: 300e3
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [7, 83]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: blocks_null_sink_0
|
||||||
|
id: blocks_null_sink
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
bus_structure_sink: '[[0,],]'
|
||||||
|
comment: ''
|
||||||
|
num_inputs: '1'
|
||||||
|
type: complex
|
||||||
|
vlen: '1'
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [544, 136.0]
|
||||||
|
rotation: 0
|
||||||
|
state: true
|
||||||
|
- name: blocks_tuntap_pdu_0
|
||||||
|
id: blocks_tuntap_pdu
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
ifn: hamnet70
|
||||||
|
istunflag: 'True'
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
mtu: MTU
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [584, 324.0]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: blocks_udp_sink_0
|
||||||
|
id: blocks_udp_sink
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
eof: 'False'
|
||||||
|
ipaddr: 192.168.23.110
|
||||||
|
port: '1234'
|
||||||
|
psize: '1472'
|
||||||
|
type: complex
|
||||||
|
vlen: '1'
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [1088, 316.0]
|
||||||
|
rotation: 0
|
||||||
|
state: true
|
||||||
|
- name: blocks_udp_source_0
|
||||||
|
id: blocks_udp_source
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
eof: 'False'
|
||||||
|
ipaddr: 0.0.0.0
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
port: '1234'
|
||||||
|
psize: '1472'
|
||||||
|
type: complex
|
||||||
|
vlen: '1'
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [88, 316.0]
|
||||||
|
rotation: 0
|
||||||
|
state: true
|
||||||
|
- name: hamnet70_demod_sc16qam_0
|
||||||
|
id: hamnet70_demod_sc16qam
|
||||||
|
parameters:
|
||||||
|
MTU: MTU
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
samp_rate: 300e3
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [280, 280.0]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: hamnet70_mod_sc16qam_0
|
||||||
|
id: hamnet70_mod_sc16qam
|
||||||
|
parameters:
|
||||||
|
MTU: MTU
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
samp_rate: samp_rate
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [824, 332.0]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: import_0
|
||||||
|
id: import
|
||||||
|
parameters:
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
imports: from gnuradio.digital.utils import tagged_streams
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [167, 11]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: import_0_0
|
||||||
|
id: import
|
||||||
|
parameters:
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
imports: import random
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [167, 59]
|
||||||
|
rotation: 0
|
||||||
|
state: disabled
|
||||||
|
- name: import_0_0_0
|
||||||
|
id: import
|
||||||
|
parameters:
|
||||||
|
alias: ''
|
||||||
|
comment: ''
|
||||||
|
imports: import numpy as np
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [271, 59]
|
||||||
|
rotation: 0
|
||||||
|
state: disabled
|
||||||
|
- name: qtgui_sink_x_0
|
||||||
|
id: qtgui_sink_x
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
bw: samp_rate
|
||||||
|
comment: ''
|
||||||
|
fc: '0'
|
||||||
|
fftsize: '1024'
|
||||||
|
gui_hint: ''
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
name: '"TX Baseband"'
|
||||||
|
plotconst: 'True'
|
||||||
|
plotfreq: 'True'
|
||||||
|
plottime: 'True'
|
||||||
|
plotwaterfall: 'True'
|
||||||
|
rate: '10'
|
||||||
|
showports: 'True'
|
||||||
|
showrf: 'False'
|
||||||
|
type: complex
|
||||||
|
wintype: firdes.WIN_BLACKMAN_hARRIS
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [1088, 156.0]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
- name: qtgui_sink_x_0_0
|
||||||
|
id: qtgui_sink_x
|
||||||
|
parameters:
|
||||||
|
affinity: ''
|
||||||
|
alias: ''
|
||||||
|
bw: samp_rate
|
||||||
|
comment: ''
|
||||||
|
fc: '0'
|
||||||
|
fftsize: '1024'
|
||||||
|
gui_hint: ''
|
||||||
|
maxoutbuf: '0'
|
||||||
|
minoutbuf: '0'
|
||||||
|
name: '"RX Baseband"'
|
||||||
|
plotconst: 'True'
|
||||||
|
plotfreq: 'True'
|
||||||
|
plottime: 'True'
|
||||||
|
plotwaterfall: 'True'
|
||||||
|
rate: '10'
|
||||||
|
showports: 'True'
|
||||||
|
showrf: 'False'
|
||||||
|
type: complex
|
||||||
|
wintype: firdes.WIN_BLACKMAN_hARRIS
|
||||||
|
states:
|
||||||
|
bus_sink: false
|
||||||
|
bus_source: false
|
||||||
|
bus_structure: null
|
||||||
|
coordinate: [656, 156.0]
|
||||||
|
rotation: 0
|
||||||
|
state: enabled
|
||||||
|
|
||||||
|
connections:
|
||||||
|
- [blocks_tuntap_pdu_0, pdus, hamnet70_mod_sc16qam_0, packet_in]
|
||||||
|
- [blocks_udp_source_0, '0', hamnet70_demod_sc16qam_0, '0']
|
||||||
|
- [hamnet70_demod_sc16qam_0, '0', blocks_null_sink_0, '0']
|
||||||
|
- [hamnet70_demod_sc16qam_0, '1', qtgui_sink_x_0_0, '0']
|
||||||
|
- [hamnet70_demod_sc16qam_0, pdu_out, blocks_tuntap_pdu_0, pdus]
|
||||||
|
- [hamnet70_mod_sc16qam_0, '0', blocks_udp_sink_0, '0']
|
||||||
|
- [hamnet70_mod_sc16qam_0, '0', qtgui_sink_x_0, '0']
|
||||||
|
|
||||||
|
metadata:
|
||||||
|
file_format: 1
|
|
@ -4,9 +4,9 @@ import numpy as np
|
||||||
import matplotlib.pyplot as pp
|
import matplotlib.pyplot as pp
|
||||||
import rrc
|
import rrc
|
||||||
|
|
||||||
pre = [ -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -1]
|
pre = np.array([ -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -1]) * (1+1j)
|
||||||
|
|
||||||
pre_up = np.zeros(2 * len(pre) + 1)
|
pre_up = np.zeros(2 * len(pre) + 1, dtype=complex)
|
||||||
|
|
||||||
pre_up[1::2] = pre
|
pre_up[1::2] = pre
|
||||||
|
|
||||||
|
@ -14,6 +14,10 @@ rrc_coef = rrc.rrc_design(150, 2)
|
||||||
|
|
||||||
pre_flt = np.convolve(pre_up, rrc_coef, mode='same')
|
pre_flt = np.convolve(pre_up, rrc_coef, mode='same')
|
||||||
|
|
||||||
|
print("===== Preamble =====")
|
||||||
|
print(list(pre))
|
||||||
|
|
||||||
|
print("===== Filtered Preamble =====")
|
||||||
print(list(pre_flt))
|
print(list(pre_flt))
|
||||||
|
|
||||||
pp.plot(pre_up)
|
pp.plot(pre_up)
|
||||||
|
|
Loading…
Reference in a new issue