From 971b6fb03ec431253badf961305f74a9648dae92 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 25 Nov 2017 20:09:10 +0100 Subject: [PATCH 01/12] Fix finding of libraries in GNU/Hurd --- CMakeLists.txt | 117 ++++++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 45 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09e932f15..231f5fe70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -408,13 +408,20 @@ endif(NOT ENABLE_GENERIC_ARCH) -############################### +################################################################################ # Find a thread library -############################### -if(OS_IS_LINUX) - find_package(Threads REQUIRED) - link_libraries(${CMAKE_THREAD_LIBS_INIT}) -endif(OS_IS_LINUX) +################################################################################ +if(NOT ${OS_IS_MACOSX}) + if(CMAKE_VERSION VERSION_LESS 3.1) + find_package(Threads REQUIRED) + link_libraries(${CMAKE_THREAD_LIBS_INIT}) + else(CMAKE_VERSION VERSION_LESS 3.1) + set(CMAKE_THREAD_PREFER_PTHREAD TRUE) + set(THREADS_PREFER_PTHREAD_FLAG TRUE) + find_package(Threads REQUIRED) + link_libraries(Threads::Threads) + endif(CMAKE_VERSION VERSION_LESS 3.1) +endif(NOT ${OS_IS_MACOSX}) @@ -891,12 +898,32 @@ endif(NOT ENABLE_LOG) ################################################################################ -# Armadillo - http://arma.sourceforge.net/ +# Find BLAS, LAPACK and GFortran ################################################################################ -if(OS_IS_LINUX) +if(NOT ${OS_IS_MACOSX}) + if(NOT LINUX_DISTRIBUTION) + set(LINUX_DISTRIBUTION "Unknown") + endif(NOT LINUX_DISTRIBUTION) + ############################################################################# - # Check that LAPACK is found in the system - # LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse. + # Check that BLAS (Basic Linear Algebra Subprograms) is found in the system + # See http://www.netlib.org/blas/ + ############################################################################# + find_library(BLAS blas) + if(NOT BLAS) + message(" The BLAS library has not been found.") + message(" You can try to install it by typing:") + if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo yum install blas-devel") + else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo apt-get install libopenblas-dev") + endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(FATAL_ERROR "BLAS is required to build gnss-sdr") + endif(NOT BLAS) + + ############################################################################# + # Check that LAPACK (Linear Algebra PACKage) is found in the system + # See http://www.netlib.org/lapack/ ############################################################################# find_library(LAPACK lapack) if(NOT LAPACK) @@ -909,34 +936,9 @@ if(OS_IS_LINUX) else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(" sudo apt-get install liblapack-dev") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - if(IS_ARM) - message(WARNING "LAPACK is recommended to build gnss-sdr") - set(LAPACK "") - else(IS_ARM) - message(FATAL_ERROR "LAPACK is required to build gnss-sdr") - endif(IS_ARM) + message(FATAL_ERROR "LAPACK is required to build gnss-sdr") endif(NOT LAPACK) - ############################################################################# - # Check that BLAS is found in the system - # BLAS is used for matrix multiplication. - # Without BLAS, matrix multiplication will still work, but might be slower. - ############################################################################# - find_library(BLAS blas) - if(NOT BLAS) - message(" The BLAS library has not been found.") - message(" You can try to install it by typing:") - if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo yum install blas-devel") - else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo apt-get install libopenblas-dev") - endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - if(IS_ARM) - message(WARNING "BLAS is recommended to build gnss-sdr") - set(BLAS "") - else(IS_ARM) - message(FATAL_ERROR "BLAS is required to build gnss-sdr") - endif(IS_ARM) - endif(NOT BLAS) + ############################################# # Check if GFORTRAN is found in the system ############################################# @@ -1037,6 +1039,25 @@ if(OS_IS_LINUX) /usr/lib/gcc/sparc64-linux-gnu/7 /usr/lib/gcc/x86_64-linux-gnux32/7 /usr/lib/gcc/sh4-linux-gnu/7 + /usr/lib/x86_64-linux-gnu # libgfortran4 + /usr/lib/i386-linux-gnu + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + /usr/lib/i386-gnu + /usr/lib/x86_64-kfreebsd-gnu + /usr/lib/i386-kfreebsd-gnu + /usr/lib/mips-linux-gnu + /usr/lib/mips64el-linux-gnuabi64 + /usr/lib/mipsel-linux-gnu + /usr/lib/powerpc-linux-gnu + /usr/lib/powerpc64-linux-gnu + /usr/lib/powerpc64le-linux-gnu + /usr/lib/s390x-linux-gnu + /usr/lib/sh4-linux-gnu + /usr/lib/sparc64-linux-gnu + /usr/lib/x86_64-linux-gnux32 + /usr/lib/alpha-linux-gnu ) if(NOT GFORTRAN) message(STATUS "The gfortran library has not been found.") @@ -1048,9 +1069,15 @@ if(OS_IS_LINUX) else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(STATUS " sudo apt-get install gfortran") endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(FATAL_ERROR "gfortran is required to build gnss-sdr") endif(NOT GFORTRAN) -endif(OS_IS_LINUX) +endif(NOT ${OS_IS_MACOSX}) + + +################################################################################ +# Armadillo - http://arma.sourceforge.net/ +################################################################################ find_package(Armadillo) if(ARMADILLO_FOUND) if(${ARMADILLO_VERSION_STRING} VERSION_LESS ${GNSSSDR_ARMADILLO_MIN_VERSION}) @@ -1137,6 +1164,7 @@ find_library(GNUTLS_OPENSSL_LIBRARY NAMES gnutls-openssl libgnutls-openssl.so.27 /usr/lib/i386-linux-gnu /usr/lib/alpha-linux-gnu /usr/lib/hppa-linux-gnu + /usr/lib/i386-gnu /usr/lib/i686-gnu /usr/lib/i686-linux-gnu /usr/lib/x86_64-kfreebsd-gnu @@ -1526,13 +1554,6 @@ endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) # Enable C++14 support in Clang from 3.5 / Fallback to C++11 if older version and use lib++ if working in macOS if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if(OS_IS_LINUX) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11") - else(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") - endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - endif(OS_IS_LINUX) if(OS_IS_MACOSX) # See https://trac.macports.org/wiki/XcodeVersionInfo for Apple Clang version equivalences if(CLANG_VERSION VERSION_LESS "600") @@ -1541,6 +1562,12 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") endif(CLANG_VERSION VERSION_LESS "600") set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -Wno-deprecated-declarations") + else(OS_IS_MACOSX) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") + set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11") + else(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") + set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") + endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") endif(OS_IS_MACOSX) if(CMAKE_BUILD_TYPE MATCHES "Release") From 5eaeed73fd507f5db51c67b1260bb968d6cc3452 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 25 Nov 2017 21:47:39 +0100 Subject: [PATCH 02/12] Fix cross-compilation --- CMakeLists.txt | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 231f5fe70..fd7d5783a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -412,15 +412,8 @@ endif(NOT ENABLE_GENERIC_ARCH) # Find a thread library ################################################################################ if(NOT ${OS_IS_MACOSX}) - if(CMAKE_VERSION VERSION_LESS 3.1) - find_package(Threads REQUIRED) - link_libraries(${CMAKE_THREAD_LIBS_INIT}) - else(CMAKE_VERSION VERSION_LESS 3.1) - set(CMAKE_THREAD_PREFER_PTHREAD TRUE) - set(THREADS_PREFER_PTHREAD_FLAG TRUE) - find_package(Threads REQUIRED) - link_libraries(Threads::Threads) - endif(CMAKE_VERSION VERSION_LESS 3.1) + find_package(Threads REQUIRED) + link_libraries(${CMAKE_THREAD_LIBS_INIT}) endif(NOT ${OS_IS_MACOSX}) From a212abd62ff9dd97a578e16eb917346ebd1760a0 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 25 Nov 2017 22:54:56 +0100 Subject: [PATCH 03/12] Fix variable usage --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fd7d5783a..7b2651b25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -411,10 +411,10 @@ endif(NOT ENABLE_GENERIC_ARCH) ################################################################################ # Find a thread library ################################################################################ -if(NOT ${OS_IS_MACOSX}) +if(NOT OS_IS_MACOSX) find_package(Threads REQUIRED) link_libraries(${CMAKE_THREAD_LIBS_INIT}) -endif(NOT ${OS_IS_MACOSX}) +endif(NOT OS_IS_MACOSX) @@ -893,7 +893,7 @@ endif(NOT ENABLE_LOG) ################################################################################ # Find BLAS, LAPACK and GFortran ################################################################################ -if(NOT ${OS_IS_MACOSX}) +if(NOT OS_IS_MACOSX) if(NOT LINUX_DISTRIBUTION) set(LINUX_DISTRIBUTION "Unknown") endif(NOT LINUX_DISTRIBUTION) @@ -1064,7 +1064,7 @@ if(NOT ${OS_IS_MACOSX}) endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") message(FATAL_ERROR "gfortran is required to build gnss-sdr") endif(NOT GFORTRAN) -endif(NOT ${OS_IS_MACOSX}) +endif(NOT OS_IS_MACOSX) From cbca2399c624f84cfc84a6788c7fdf760f207522 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 26 Nov 2017 00:18:21 +0100 Subject: [PATCH 04/12] Improve CMake usage for Threads --- CMakeLists.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b2651b25..66fa25b8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -409,12 +409,21 @@ endif(NOT ENABLE_GENERIC_ARCH) ################################################################################ -# Find a thread library +# Find the POSIX thread (pthread) libraries ################################################################################ -if(NOT OS_IS_MACOSX) +if(CMAKE_VERSION VERSION_LESS 3.1) find_package(Threads REQUIRED) link_libraries(${CMAKE_THREAD_LIBS_INIT}) -endif(NOT OS_IS_MACOSX) +else(CMAKE_VERSION VERSION_LESS 3.1) + set(CMAKE_THREAD_PREFER_PTHREAD TRUE) + if(CMAKE_CROSSCOMPILING) + set(THREADS_PREFER_PTHREAD_FLAG FALSE) + else(CMAKE_CROSSCOMPILING) + set(THREADS_PREFER_PTHREAD_FLAG TRUE) + endif(CMAKE_CROSSCOMPILING) + find_package(Threads REQUIRED) + link_libraries(Threads::Threads) +endif(CMAKE_VERSION VERSION_LESS 3.1) From 7e4c1fb946d94fc56b30b6d6ac7f69ecab3a2dab Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 26 Nov 2017 01:48:48 +0100 Subject: [PATCH 05/12] Simplify finding of BLAS, LAPACK and GFORTRAN --- CMakeLists.txt | 237 ++++++++----------------------- cmake/Modules/FindGFORTRAN.cmake | 124 ++++++++++++++++ 2 files changed, 181 insertions(+), 180 deletions(-) create mode 100644 cmake/Modules/FindGFORTRAN.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 66fa25b8b..4112756b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -215,6 +215,9 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") endif(NOT LINUX_DISTRIBUTION) message(STATUS "Configuring GNSS-SDR v${VERSION} to be built on ${LINUX_DISTRIBUTION} GNU/Linux Release ${LINUX_VER} ${ARCH_}") endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") +if(NOT LINUX_DISTRIBUTION) + set(LINUX_DISTRIBUTION "Unknown") +endif(NOT LINUX_DISTRIBUTION) # Detect macOS / Mac OS X Version if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") @@ -899,181 +902,41 @@ endif(NOT ENABLE_LOG) -################################################################################ -# Find BLAS, LAPACK and GFortran -################################################################################ -if(NOT OS_IS_MACOSX) - if(NOT LINUX_DISTRIBUTION) - set(LINUX_DISTRIBUTION "Unknown") - endif(NOT LINUX_DISTRIBUTION) +############################################################################# +# Check that BLAS (Basic Linear Algebra Subprograms) is found in the system +# See http://www.netlib.org/blas/ +############################################################################# +find_library(BLAS blas) +if(NOT BLAS) + message(" The BLAS library has not been found.") + message(" You can try to install it by typing:") + if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo yum install blas-devel") + else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo apt-get install libblas-dev") + endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(FATAL_ERROR "BLAS is required to build gnss-sdr") +endif(NOT BLAS) - ############################################################################# - # Check that BLAS (Basic Linear Algebra Subprograms) is found in the system - # See http://www.netlib.org/blas/ - ############################################################################# - find_library(BLAS blas) - if(NOT BLAS) - message(" The BLAS library has not been found.") - message(" You can try to install it by typing:") - if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo yum install blas-devel") - else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo apt-get install libopenblas-dev") - endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(FATAL_ERROR "BLAS is required to build gnss-sdr") - endif(NOT BLAS) - ############################################################################# - # Check that LAPACK (Linear Algebra PACKage) is found in the system - # See http://www.netlib.org/lapack/ - ############################################################################# - find_library(LAPACK lapack) - if(NOT LAPACK) - message(" The LAPACK library has not been found.") - message(" You can try to install it by typing:") - if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo yum install lapack-devel") - elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") - message(" sudo zypper install lapack-devel") - else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(" sudo apt-get install liblapack-dev") - endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(FATAL_ERROR "LAPACK is required to build gnss-sdr") - endif(NOT LAPACK) - ############################################# - # Check if GFORTRAN is found in the system - ############################################# - find_library(GFORTRAN NAMES gfortran - PATHS /usr/lib - /usr/lib64 - /usr/local/lib - /usr/local/lib/i386 - /usr/lib/gcc/x86_64-linux-gnu - /usr/lib/gcc/i686-linux-gnu - /usr/lib/gcc/i386-linux-gnu - /usr/lib/gcc/x86_64-linux-gnu/4.6 # Ubuntu 12.04 - /usr/lib/gcc/i686-linux-gnu/4.6 - /usr/lib/gcc/x86_64-linux-gnu/4.7 - /usr/lib/gcc/i686-linux-gnu/4.7 - /usr/lib/gcc/x86_64-linux-gnu/4.8 - /usr/lib/gcc/i686-linux-gnu/4.8 - /usr/lib/gcc/x86_64-linux-gnu/4.9 - /usr/lib/gcc/i686-linux-gnu/4.9 - /usr/lib/gcc/x86_64-redhat-linux/4.7.2 # Fedora 18 - /usr/lib/gcc/i686-redhat-linux/4.7.2 - /usr/lib/gcc/x86_64-redhat-linux/4.8.1 # Fedora 19 - /usr/lib/gcc/x86_64-redhat-linux/4.8.3 # Fedora 20 - /usr/lib/gcc/x86_64-redhat-linux/4.9.1 # Fedora 21 - /usr/lib/gcc/i686-redhat-linux/4.8.1 - /usr/lib/gcc/i686-redhat-linux/4.8.3 - /usr/lib/gcc/i686-redhat-linux/4.9.1 - /usr/lib/gcc/x86_64-redhat-linux/4.4.4 # CentOS 6 - /usr/lib/gcc/i686-redhat-linux/4.4.4 - /usr/lib/gcc/x86_64-redhat-linux/4.8.2 - /usr/lib/gcc/i686-redhat-linux/4.8.2 - /usr/lib/gcc/i586-suse-linux/4.8 # OpenSUSE 13.1 - /usr/lib/gcc/i586-suse-linux/4.9 - /usr/lib/gcc/x86_64-suse-linux/4.8 - /usr/lib/gcc/x86_64-suse-linux/4.9 - /usr/lib/gcc/i486-linux-gnu # Debian 7 - /usr/lib/gcc/i486-linux-gnu/4.4 - /usr/lib/gcc/i486-linux-gnu/4.6 - /usr/lib/gcc/i486-linux-gnu/4.7 - /usr/lib/gcc/i486-linux-gnu/4.8 - /usr/lib/gcc/i486-linux-gnu/4.9 - /usr/lib/gcc/i586-linux-gnu/4.9 - /usr/lib/gcc/arm-linux-gnueabihf/4.4 # Debian armhf - /usr/lib/gcc/arm-linux-gnueabihf/4.5 - /usr/lib/gcc/arm-linux-gnueabihf/4.6 - /usr/lib/gcc/arm-linux-gnueabihf/4.7 - /usr/lib/gcc/arm-linux-gnueabihf/4.8 - /usr/lib/gcc/arm-linux-gnueabihf/4.9 - /usr/lib/gcc/aarch64-linux-gnu/4.9 # Debian arm64 - /usr/lib/gcc/arm-linux-gnueabi/4.7 # Debian armel - /usr/lib/gcc/arm-linux-gnueabi/4.9 - /usr/lib/gcc/x86_64-linux-gnu/5 - /usr/lib/gcc/i686-linux-gnu/5 - /usr/lib/gcc/arm-linux-gnueabi/5 - /usr/lib/gcc/arm-linux-gnueabihf/5 - /usr/lib/gcc/aarch64-linux-gnu/5 - /usr/lib/gcc/x86_64-linux-gnu/6 # Ubuntu 16.10 - /usr/lib/gcc/alpha-linux-gnu/6 - /usr/lib/gcc/aarch64-linux-gnu/6 - /usr/lib/gcc/arm-linux-gnueabi/6 - /usr/lib/gcc/arm-linux-gnueabihf/6 - /usr/lib/gcc/hppa-linux-gnu/6 - /usr/lib/gcc/i686-gnu/6 - /usr/lib/gcc/i686-linux-gnu/6 - /usr/lib/gcc/x86_64-kfreebsd-gnu/6 - /usr/lib/gcc/i686-kfreebsd-gnu/6 - /usr/lib/gcc/m68k-linux-gnu/6 - /usr/lib/gcc/mips-linux-gnu/6 - /usr/lib/gcc/mips64el-linux-gnuabi64/6 - /usr/lib/gcc/mipsel-linux-gnu/6 - /usr/lib/gcc/powerpc-linux-gnu/6 - /usr/lib/gcc/powerpc-linux-gnuspe/6 - /usr/lib/gcc/powerpc64-linux-gnu/6 - /usr/lib/gcc/powerpc64le-linux-gnu/6 - /usr/lib/gcc/s390x-linux-gnu/6 - /usr/lib/gcc/sparc64-linux-gnu/6 - /usr/lib/gcc/x86_64-linux-gnux32/6 - /usr/lib/gcc/sh4-linux-gnu/6 - /usr/lib/gcc/x86_64-linux-gnu/7 # Debian 9 Buster - /usr/lib/gcc/alpha-linux-gnu/7 - /usr/lib/gcc/aarch64-linux-gnu/7 - /usr/lib/gcc/arm-linux-gnueabi/7 - /usr/lib/gcc/arm-linux-gnueabihf/7 - /usr/lib/gcc/hppa-linux-gnu/7 - /usr/lib/gcc/i686-gnu/7 - /usr/lib/gcc/i686-linux-gnu/7 - /usr/lib/gcc/x86_64-kfreebsd-gnu/7 - /usr/lib/gcc/i686-kfreebsd-gnu/7 - /usr/lib/gcc/m68k-linux-gnu/7 - /usr/lib/gcc/mips-linux-gnu/7 - /usr/lib/gcc/mips64el-linux-gnuabi64/7 - /usr/lib/gcc/mipsel-linux-gnu/7 - /usr/lib/gcc/powerpc-linux-gnu/7 - /usr/lib/gcc/powerpc-linux-gnuspe/7 - /usr/lib/gcc/powerpc64-linux-gnu/7 - /usr/lib/gcc/powerpc64le-linux-gnu/7 - /usr/lib/gcc/s390x-linux-gnu/7 - /usr/lib/gcc/sparc64-linux-gnu/7 - /usr/lib/gcc/x86_64-linux-gnux32/7 - /usr/lib/gcc/sh4-linux-gnu/7 - /usr/lib/x86_64-linux-gnu # libgfortran4 - /usr/lib/i386-linux-gnu - /usr/lib/arm-linux-gnueabi - /usr/lib/arm-linux-gnueabihf - /usr/lib/aarch64-linux-gnu - /usr/lib/i386-gnu - /usr/lib/x86_64-kfreebsd-gnu - /usr/lib/i386-kfreebsd-gnu - /usr/lib/mips-linux-gnu - /usr/lib/mips64el-linux-gnuabi64 - /usr/lib/mipsel-linux-gnu - /usr/lib/powerpc-linux-gnu - /usr/lib/powerpc64-linux-gnu - /usr/lib/powerpc64le-linux-gnu - /usr/lib/s390x-linux-gnu - /usr/lib/sh4-linux-gnu - /usr/lib/sparc64-linux-gnu - /usr/lib/x86_64-linux-gnux32 - /usr/lib/alpha-linux-gnu - ) - if(NOT GFORTRAN) - message(STATUS "The gfortran library has not been found.") - message(STATUS " You can try to install it by typing:") - if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(STATUS " sudo yum install gcc-fortran") - elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") - message(STATUS " sudo zypper install gcc-fortran") - else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(STATUS " sudo apt-get install gfortran") - endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") - message(FATAL_ERROR "gfortran is required to build gnss-sdr") - endif(NOT GFORTRAN) -endif(NOT OS_IS_MACOSX) +############################################################################# +# Check that LAPACK (Linear Algebra PACKage) is found in the system +# See http://www.netlib.org/lapack/ +############################################################################# +find_library(LAPACK lapack) +if(NOT LAPACK) + message(" The LAPACK library has not been found.") + message(" You can try to install it by typing:") + if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo yum install lapack-devel") + elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") + message(" sudo zypper install lapack-devel") + else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(" sudo apt-get install liblapack-dev") + endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(FATAL_ERROR "LAPACK is required to build gnss-sdr") +endif(NOT LAPACK) @@ -1094,7 +957,29 @@ if(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO) message(STATUS " when doing '${CMAKE_MAKE_PROGRAM_PRETTY_NAME}'. ") set(armadillo_BRANCH ${GNSSSDR_ARMADILLO_LOCAL_VERSION}) set(armadillo_RELEASE ${armadillo_BRANCH}) + + ############################################# + # Check if GFORTRAN is found in the system + ############################################# + if(NOT OS_IS_MACOSX) + find_package(GFORTRAN) + if(NOT GFORTRAN) + message(STATUS "The gfortran library has not been found.") + message(STATUS " You can try to install it by typing:") + if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(STATUS " sudo yum install gcc-fortran") + elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE") + message(STATUS " sudo zypper install gcc-fortran") + else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(STATUS " sudo apt-get install gfortran") + endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat") + message(FATAL_ERROR "gfortran is required to build gnss-sdr") + endif(NOT GFORTRAN) + endif(NOT OS_IS_MACOSX) + ############################################# + # Download and build Armadillo + ############################################# if(CMAKE_VERSION VERSION_LESS 3.2) ExternalProject_Add( armadillo-${armadillo_RELEASE} @@ -1127,14 +1012,6 @@ if(NOT ARMADILLO_FOUND OR ENABLE_OWN_ARMADILLO) # Set up variables ExternalProject_Get_Property(armadillo-${armadillo_RELEASE} binary_dir) set(ARMADILLO_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/armadillo/armadillo-${armadillo_RELEASE}/include ) - find_library(LAPACK NAMES lapack HINTS /usr/lib /usr/local/lib /usr/lib64) - if(OS_IS_MACOSX) - find_library(BLAS blas) - endif(OS_IS_MACOSX) - find_package(OpenBLAS) - if(OPENBLAS_FOUND) - set(BLAS ${OPENBLAS}) - endif(OPENBLAS_FOUND) if(NOT GFORTRAN) set(GFORTRAN "") endif(NOT GFORTRAN) diff --git a/cmake/Modules/FindGFORTRAN.cmake b/cmake/Modules/FindGFORTRAN.cmake new file mode 100644 index 000000000..b676fec0f --- /dev/null +++ b/cmake/Modules/FindGFORTRAN.cmake @@ -0,0 +1,124 @@ + + find_library(GFORTRAN NAMES gfortran + PATHS /usr/lib + /usr/lib64 + /usr/local/lib + /usr/local/lib/i386 + /usr/lib/gcc/x86_64-linux-gnu + /usr/lib/gcc/i686-linux-gnu + /usr/lib/gcc/i386-linux-gnu + /usr/lib/gcc/x86_64-linux-gnu/4.6 # Ubuntu 12.04 + /usr/lib/gcc/i686-linux-gnu/4.6 + /usr/lib/gcc/x86_64-linux-gnu/4.7 + /usr/lib/gcc/i686-linux-gnu/4.7 + /usr/lib/gcc/x86_64-linux-gnu/4.8 + /usr/lib/gcc/i686-linux-gnu/4.8 + /usr/lib/gcc/x86_64-linux-gnu/4.9 + /usr/lib/gcc/i686-linux-gnu/4.9 + /usr/lib/gcc/x86_64-redhat-linux/4.7.2 # Fedora 18 + /usr/lib/gcc/i686-redhat-linux/4.7.2 + /usr/lib/gcc/x86_64-redhat-linux/4.8.1 # Fedora 19 + /usr/lib/gcc/x86_64-redhat-linux/4.8.3 # Fedora 20 + /usr/lib/gcc/x86_64-redhat-linux/4.9.1 # Fedora 21 + /usr/lib/gcc/i686-redhat-linux/4.8.1 + /usr/lib/gcc/i686-redhat-linux/4.8.3 + /usr/lib/gcc/i686-redhat-linux/4.9.1 + /usr/lib/gcc/x86_64-redhat-linux/4.4.4 # CentOS 6 + /usr/lib/gcc/i686-redhat-linux/4.4.4 + /usr/lib/gcc/x86_64-redhat-linux/4.8.2 + /usr/lib/gcc/i686-redhat-linux/4.8.2 + /usr/lib/gcc/x86_64-redhat-linux/7 + /usr/lib/gcc/i686-redhat-linux/7 + /usr/lib/gcc/armv7hl-redhat-linux-gnueabi/7 + /usr/lib/gcc/aarch64-redhat-linux/7 + /usr/lib/gcc/i586-suse-linux/4.8 # OpenSUSE 13.1 + /usr/lib/gcc/i586-suse-linux/4.9 + /usr/lib/gcc/x86_64-suse-linux/4.8 + /usr/lib/gcc/x86_64-suse-linux/4.9 + /usr/lib/gcc/i486-linux-gnu # Debian 7 + /usr/lib/gcc/i486-linux-gnu/4.4 + /usr/lib/gcc/i486-linux-gnu/4.6 + /usr/lib/gcc/i486-linux-gnu/4.7 + /usr/lib/gcc/i486-linux-gnu/4.8 + /usr/lib/gcc/i486-linux-gnu/4.9 + /usr/lib/gcc/i586-linux-gnu/4.9 + /usr/lib/gcc/arm-linux-gnueabihf/4.4 # Debian armhf + /usr/lib/gcc/arm-linux-gnueabihf/4.5 + /usr/lib/gcc/arm-linux-gnueabihf/4.6 + /usr/lib/gcc/arm-linux-gnueabihf/4.7 + /usr/lib/gcc/arm-linux-gnueabihf/4.8 + /usr/lib/gcc/arm-linux-gnueabihf/4.9 + /usr/lib/gcc/aarch64-linux-gnu/4.9 # Debian arm64 + /usr/lib/gcc/arm-linux-gnueabi/4.7 # Debian armel + /usr/lib/gcc/arm-linux-gnueabi/4.9 + /usr/lib/gcc/x86_64-linux-gnu/5 + /usr/lib/gcc/i686-linux-gnu/5 + /usr/lib/gcc/arm-linux-gnueabi/5 + /usr/lib/gcc/arm-linux-gnueabihf/5 + /usr/lib/gcc/aarch64-linux-gnu/5 + /usr/lib/gcc/x86_64-linux-gnu/6 # Ubuntu 16.10 + /usr/lib/gcc/alpha-linux-gnu/6 + /usr/lib/gcc/aarch64-linux-gnu/6 + /usr/lib/gcc/arm-linux-gnueabi/6 + /usr/lib/gcc/arm-linux-gnueabihf/6 + /usr/lib/gcc/hppa-linux-gnu/6 + /usr/lib/gcc/i686-gnu/6 + /usr/lib/gcc/i686-linux-gnu/6 + /usr/lib/gcc/x86_64-kfreebsd-gnu/6 + /usr/lib/gcc/i686-kfreebsd-gnu/6 + /usr/lib/gcc/m68k-linux-gnu/6 + /usr/lib/gcc/mips-linux-gnu/6 + /usr/lib/gcc/mips64el-linux-gnuabi64/6 + /usr/lib/gcc/mipsel-linux-gnu/6 + /usr/lib/gcc/powerpc-linux-gnu/6 + /usr/lib/gcc/powerpc-linux-gnuspe/6 + /usr/lib/gcc/powerpc64-linux-gnu/6 + /usr/lib/gcc/powerpc64le-linux-gnu/6 + /usr/lib/gcc/s390x-linux-gnu/6 + /usr/lib/gcc/sparc64-linux-gnu/6 + /usr/lib/gcc/x86_64-linux-gnux32/6 + /usr/lib/gcc/sh4-linux-gnu/6 + /usr/lib/gcc/x86_64-linux-gnu/7 # Debian 9 Buster + /usr/lib/gcc/alpha-linux-gnu/7 + /usr/lib/gcc/aarch64-linux-gnu/7 + /usr/lib/gcc/arm-linux-gnueabi/7 + /usr/lib/gcc/arm-linux-gnueabihf/7 + /usr/lib/gcc/hppa-linux-gnu/7 + /usr/lib/gcc/i686-gnu/7 + /usr/lib/gcc/i686-linux-gnu/7 + /usr/lib/gcc/x86_64-kfreebsd-gnu/7 + /usr/lib/gcc/i686-kfreebsd-gnu/7 + /usr/lib/gcc/m68k-linux-gnu/7 + /usr/lib/gcc/mips-linux-gnu/7 + /usr/lib/gcc/mips64el-linux-gnuabi64/7 + /usr/lib/gcc/mipsel-linux-gnu/7 + /usr/lib/gcc/powerpc-linux-gnu/7 + /usr/lib/gcc/powerpc-linux-gnuspe/7 + /usr/lib/gcc/powerpc64-linux-gnu/7 + /usr/lib/gcc/powerpc64le-linux-gnu/7 + /usr/lib/gcc/s390x-linux-gnu/7 + /usr/lib/gcc/sparc64-linux-gnu/7 + /usr/lib/gcc/x86_64-linux-gnux32/7 + /usr/lib/gcc/sh4-linux-gnu/7 + /usr/lib/x86_64-linux-gnu # libgfortran4 + /usr/lib/i386-linux-gnu + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + /usr/lib/i386-gnu + /usr/lib/x86_64-kfreebsd-gnu + /usr/lib/i386-kfreebsd-gnu + /usr/lib/mips-linux-gnu + /usr/lib/mips64el-linux-gnuabi64 + /usr/lib/mipsel-linux-gnu + /usr/lib/powerpc-linux-gnu + /usr/lib/powerpc64-linux-gnu + /usr/lib/powerpc64le-linux-gnu + /usr/lib/s390x-linux-gnu + /usr/lib/sh4-linux-gnu + /usr/lib/sparc64-linux-gnu + /usr/lib/x86_64-linux-gnux32 + /usr/lib/alpha-linux-gnu + ) +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GFORTRAN DEFAULT_MSG GFORTRAN) \ No newline at end of file From 59d1067d59827f16c9abe7c327d0342e5406d604 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 26 Nov 2017 10:49:42 +0100 Subject: [PATCH 06/12] Fix parallel building when MATIO is not present. Fix building with Ninja Matio is no longer optional but mandatory --- CMakeLists.txt | 136 +++++++++--------- .../gnuradio_blocks/CMakeLists.txt | 6 +- .../tracking/gnuradio_blocks/CMakeLists.txt | 10 +- 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4112756b2..39a7f9cf4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1088,6 +1088,74 @@ endif(NOT GNUTLS_OPENSSL_LIBRARY) +######################################################################## +# Matio - https://github.com/tbeu/matio +######################################################################## +find_package(MATIO) +if(NOT MATIO_FOUND) + find_package(ZLIB) + if(ZLIB_FOUND) + get_filename_component(ZLIB_BASE_DIR ${ZLIB_INCLUDE_DIRS} DIRECTORY) + find_package(HDF5) + if(HDF5_FOUND) + list(GET HDF5_LIBRARIES 0 HDF5_FIRST_DIR) + get_filename_component(HDF5_BASE_DIR2 ${HDF5_FIRST_DIR} DIRECTORY) + get_filename_component(HDF5_BASE_DIR ${HDF5_BASE_DIR2} DIRECTORY) + if(OS_IS_MACOSX) + if(EXISTS /opt/local/include/hdf5.h) + set(HDF5_BASE_DIR /opt/local) + endif(EXISTS /opt/local/include/hdf5.h) + if(EXISTS /usr/local/include/hdf5.h) + set(HDF5_BASE_DIR /usr/local) + endif(EXISTS /usr/local/include/hdf5.h) + endif(OS_IS_MACOSX) + if(CMAKE_VERSION VERSION_LESS 3.2) + ExternalProject_Add( + matio-${GNSSSDR_MATIO_LOCAL_VERSION} + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mati + GIT_REPOSITORY https://github.com/tbeu/matio + GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} + UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh + CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix= + BUILD_COMMAND make + ) + else(CMAKE_VERSION VERSION_LESS 3.2) + ExternalProject_Add( + matio-${GNSSSDR_MATIO_LOCAL_VERSION} + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/matio + GIT_REPOSITORY https://github.com/tbeu/matio + GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} + UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh + CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix= + BUILD_COMMAND make + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + endif(CMAKE_VERSION VERSION_LESS 3.2) + set(MATIO_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ) + set(MATIO_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/matio/include ) + set(MATIO_LOCAL true) + else(HDF5_FOUND) + message(STATUS " The hdf5 library has not been found in your system.") + message(STATUS " Please try to install it by doing:") + if(OS_IS_MACOSX) + message(STATUS " $ sudo port install hdf5") + message(STATUS " or") + message(STATUS " $ brew install hdf5") + endif(OS_IS_MACOSX) + if(OS_IS_LINUX) + message(STATUS " $ sudo apt-get install libhdf5-dev") + endif(OS_IS_LINUX) + message(FATAL_ERROR "*** The hdf5 library is required to build gnss-sdr") + endif(HDF5_FOUND) + else(ZLIB_FOUND) + message(FATAL_ERROR "*** The zlib library is required to build gnss-sdr") + endif(ZLIB_FOUND) +endif(NOT MATIO_FOUND) + + + ################################################################################ # USRP Hardware Driver (UHD) - OPTIONAL ################################################################################ @@ -1350,74 +1418,6 @@ endif(ENABLE_GPROF) -######################################################################## -# Matio (OPTIONAL) - https://github.com/tbeu/matio -######################################################################## -find_package(MATIO) -if(NOT MATIO_FOUND) - find_package(ZLIB) - if(ZLIB_FOUND) - get_filename_component(ZLIB_BASE_DIR ${ZLIB_INCLUDE_DIRS} DIRECTORY) - find_package(HDF5) - if(HDF5_FOUND) - list(GET HDF5_LIBRARIES 0 HDF5_FIRST_DIR) - get_filename_component(HDF5_BASE_DIR2 ${HDF5_FIRST_DIR} DIRECTORY) - get_filename_component(HDF5_BASE_DIR ${HDF5_BASE_DIR2} DIRECTORY) - if(OS_IS_MACOSX) - if(EXISTS /opt/local/include/hdf5.h) - set(HDF5_BASE_DIR /opt/local) - endif(EXISTS /opt/local/include/hdf5.h) - if(EXISTS /usr/local/include/hdf5.h) - set(HDF5_BASE_DIR /usr/local) - endif(EXISTS /usr/local/include/hdf5.h) - endif(OS_IS_MACOSX) - if(CMAKE_VERSION VERSION_LESS 3.2) - ExternalProject_Add( - matio-${GNSSSDR_MATIO_LOCAL_VERSION} - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mati - GIT_REPOSITORY https://github.com/tbeu/matio - GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} - UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh - CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix= - BUILD_COMMAND "${CMAKE_MAKE_PROGRAM}" - ) - else(CMAKE_VERSION VERSION_LESS 3.2) - ExternalProject_Add( - matio-${GNSSSDR_MATIO_LOCAL_VERSION} - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/matio - GIT_REPOSITORY https://github.com/tbeu/matio - GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} - UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh - CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix= - BUILD_COMMAND "${CMAKE_MAKE_PROGRAM}" - BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} - ) - endif(CMAKE_VERSION VERSION_LESS 3.2) - set(MATIO_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ) - set(MATIO_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/matio/include ) - set(MATIO_LOCAL true) - else(HDF5_FOUND) - message(STATUS " The hdf5 library has not been found in your system.") - message(STATUS " Please try to install it by doing:") - if(OS_IS_MACOSX) - message(STATUS " $ sudo port install hdf5") - message(STATUS " or") - message(STATUS " $ brew install hdf5") - endif(OS_IS_MACOSX) - if(OS_IS_LINUX) - message(STATUS " $ sudo apt-get install libhdf5-dev") - endif(OS_IS_LINUX) - message(FATAL_ERROR "*** The hdf5 library is required to build gnss-sdr") - endif(HDF5_FOUND) - else(ZLIB_FOUND) - message(FATAL_ERROR "*** The zlib library is required to build gnss-sdr") - endif(ZLIB_FOUND) -endif(NOT MATIO_FOUND) - - - ######################################################################## # Set compiler flags ######################################################################## diff --git a/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt b/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt index 74bb5280f..98b8213d8 100644 --- a/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/observables/gnuradio_blocks/CMakeLists.txt @@ -38,5 +38,9 @@ file(GLOB OBS_GR_BLOCKS_HEADERS "*.h") list(SORT OBS_GR_BLOCKS_HEADERS) add_library(obs_gr_blocks ${OBS_GR_BLOCKS_SOURCES} ${OBS_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${OBS_GR_BLOCKS_HEADERS}) -add_dependencies(obs_gr_blocks glog-${glog_RELEASE} armadillo-${armadillo_RELEASE}) +if(MATIO_FOUND) + add_dependencies(obs_gr_blocks glog-${glog_RELEASE} armadillo-${armadillo_RELEASE}) +else(MATIO_FOUND) + add_dependencies(obs_gr_blocks glog-${glog_RELEASE} armadillo-${armadillo_RELEASE} matio-${GNSSSDR_MATIO_LOCAL_VERSION}) +endif(MATIO_FOUND) target_link_libraries(obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${ARMADILLO_LIBRARIES} ${MATIO_LIBRARIES}) diff --git a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt index cb42a6725..05001d3e1 100644 --- a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt @@ -66,5 +66,13 @@ source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS}) target_link_libraries(tracking_gr_blocks tracking_lib ${GNURADIO_RUNTIME_LIBRARIES} gnss_sp_libs ${Boost_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${MATIO_LIBRARIES} ${OPT_TRACKING_LIBRARIES}) if(NOT VOLK_GNSSSDR_FOUND) - add_dependencies(tracking_gr_blocks volk_gnsssdr_module) + if(MATIO_FOUND) + add_dependencies(tracking_gr_blocks volk_gnsssdr_module) + else(MATIO_FOUND) + add_dependencies(tracking_gr_blocks volk_gnsssdr_module matio-${GNSSSDR_MATIO_LOCAL_VERSION}) + endif(MATIO_FOUND) +else(NOT VOLK_GNSSSDR_FOUND) + if(NOT MATIO_FOUND) + add_dependencies(tracking_gr_blocks matio-${GNSSSDR_MATIO_LOCAL_VERSION}) + endif(NOT MATIO_FOUND) endif(NOT VOLK_GNSSSDR_FOUND) From 46d64af778803dbcc001e06e3faecc2be7702afe Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 26 Nov 2017 18:59:00 +0100 Subject: [PATCH 07/12] Matio is not optional --- src/tests/CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 04bbf7841..4fe2bac30 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -161,11 +161,6 @@ if(GNUPLOT_FOUND) add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}") endif(GNUPLOT_FOUND) -if(MATIO_FOUND OR MATIO_LOCAL) - add_definitions(-DMATIO_TEST=1) - set(GNSS_SDR_TEST_OPTIONAL_LIBS "${GNSS_SDR_TEST_OPTIONAL_LIBS};${MATIO_LIBRARIES}") - set(GNSS_SDR_TEST_OPTIONAL_HEADERS "${GNSS_SDR_TEST_OPTIONAL_HEADERS};${MATIO_INCLUDE_DIRS}") -endif(MATIO_FOUND OR MATIO_LOCAL) ################################################################################ # Optional generator @@ -324,6 +319,7 @@ include_directories( ${ARMADILLO_INCLUDE_DIRS} ${VOLK_INCLUDE_DIRS} ${VOLK_GNSSSDR_INCLUDE_DIRS} + ${MATIO_INCLUDE_DIRS} ${GNSS_SDR_TEST_OPTIONAL_HEADERS} ) @@ -358,6 +354,7 @@ if(ENABLE_UNIT_TESTING) pvt_gr_blocks signal_processing_testing_lib ${VOLK_GNSSSDR_LIBRARIES} + ${MATIO_LIBRARIES} ${GNSS_SDR_TEST_OPTIONAL_LIBS} ) if(NOT ${GTEST_DIR_LOCAL}) @@ -389,6 +386,7 @@ if(ENABLE_FPGA) ${GNURADIO_BLOCKS_LIBRARIES} ${ARMADILLO_LIBRARIES} ${VOLK_LIBRARIES} + ${MATIO_LIBRARIES} channel_fsm gnss_sp_libs gnss_rx From 140b38806623155fa907f6e426781efa774a31d5 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Mon, 20 Nov 2017 12:31:49 +0100 Subject: [PATCH 08/12] Modify RTKLIB PVT band selection and Tel. Dec. E5a --- src/algorithms/PVT/adapters/rtklib_pvt.cc | 5 +- src/algorithms/PVT/libs/rtklib_solver.cc | 5 +- .../libs/rtklib/rtklib_conversions.cc | 18 +- src/algorithms/libs/rtklib/rtklib_pntpos.cc | 89 ++-- src/algorithms/libs/rtklib/rtklib_rtkcmn.cc | 2 +- .../gnuradio_blocks/hybrid_observables_cc.cc | 9 - .../galileo_e5a_telemetry_decoder_cc.cc | 457 ++++++++---------- .../galileo_e5a_telemetry_decoder_cc.h | 47 +- src/core/system_parameters/Galileo_E1.h | 1 - src/core/system_parameters/Galileo_E5a.h | 8 +- 10 files changed, 288 insertions(+), 353 deletions(-) diff --git a/src/algorithms/PVT/adapters/rtklib_pvt.cc b/src/algorithms/PVT/adapters/rtklib_pvt.cc index 8e1e9fbe0..be1c9bd8d 100644 --- a/src/algorithms/PVT/adapters/rtklib_pvt.cc +++ b/src/algorithms/PVT/adapters/rtklib_pvt.cc @@ -193,9 +193,8 @@ RtklibPvt::RtklibPvt(ConfigurationInterface* configuration, int num_bands = 0; if ((gps_1C_count > 0) || (gal_1B_count > 0)) num_bands = 1; - if (((gps_1C_count > 0) || (gal_1B_count > 0)) && (gps_2S_count > 0) ) num_bands = 2; - if (((gps_1C_count > 0) || (gal_1B_count > 0)) && ((gal_E5a_count > 0) || (gal_E5b_count > 0)) ) num_bands = 2; - if (((gps_1C_count > 0) || (gal_1B_count > 0)) && (gps_2S_count > 0) && ((gal_E5a_count > 0) || (gal_E5b_count > 0))) num_bands = 3; + if (gps_2S_count > 0) num_bands = 2; + if ((gal_E5a_count > 0) || (gal_E5b_count > 0)) num_bands = 3; int number_of_frequencies = configuration->property(role + ".num_bands", num_bands); /* (1:L1, 2:L1+L2, 3:L1+L2+L5) */ if( (number_of_frequencies < 1) || (number_of_frequencies > 3) ) { diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index 344888f67..1d29e5a5a 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -184,7 +184,10 @@ bool rtklib_solver::get_PVT(const std::map & gnss_observables_ //convert ephemeris from GNSS-SDR class to RTKLIB structure eph_data[valid_obs] = eph_to_rtklib(galileo_ephemeris_iter->second); //convert observation from GNSS-SDR class to RTKLIB structure - obsd_t newobs = {{0,0}, '0', '0', {}, {}, {}, {}, {}, {}}; + unsigned char default_code_ = static_cast(CODE_NONE); + obsd_t newobs = {{0,0}, '0', '0', {}, {}, + {default_code_, default_code_, default_code_}, + {}, {0.0, 0.0, 0.0}, {}}; obs_data[valid_obs] = insert_obs_to_rtklib(newobs, gnss_observables_iter->second, galileo_ephemeris_iter->second.WN_5, diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index c5e673b9c..ad8810fb3 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -36,7 +36,18 @@ obsd_t insert_obs_to_rtklib(obsd_t & rtklib_obs, const Gnss_Synchro & gnss_synch rtklib_obs.D[band] = gnss_synchro.Carrier_Doppler_hz; rtklib_obs.P[band] = gnss_synchro.Pseudorange_m; rtklib_obs.L[band] = gnss_synchro.Carrier_phase_rads / (2.0 * PI); - + switch(band) + { + case 0: + rtklib_obs.code[band] = static_cast(CODE_L1C); + break; + case 1: + rtklib_obs.code[band] = static_cast(CODE_L2S); + break; + case 2: + rtklib_obs.code[band] = static_cast(CODE_L5X); + break; + } double CN0_dB_Hz_est = gnss_synchro.CN0_dB_hz; if (CN0_dB_Hz_est > 63.75) CN0_dB_Hz_est = 63.75; if (CN0_dB_Hz_est < 0.0) CN0_dB_Hz_est = 0.0; @@ -56,7 +67,6 @@ obsd_t insert_obs_to_rtklib(obsd_t & rtklib_obs, const Gnss_Synchro & gnss_synch } rtklib_obs.time = gpst2time(adjgpsweek(week), gnss_synchro.RX_time); rtklib_obs.rcv = 1; - //printf("OBS RX TIME [%i]: %s,%f\n\r",rtklib_obs.sat,time_str(rtklib_obs.time,3),rtklib_obs.time.sec); return rtklib_obs; } @@ -88,8 +98,8 @@ eph_t eph_to_rtklib(const Galileo_Ephemeris & gal_eph) rtklib_sat.f0 = gal_eph.af0_4; rtklib_sat.f1 = gal_eph.af1_4; rtklib_sat.f2 = gal_eph.af2_4; - rtklib_sat.tgd[0] = 0; - rtklib_sat.tgd[1] = 0; + rtklib_sat.tgd[0] = gal_eph.BGD_E1E5a_5; + rtklib_sat.tgd[1] = gal_eph.BGD_E1E5b_5; rtklib_sat.tgd[2] = 0; rtklib_sat.tgd[3] = 0; rtklib_sat.toes = gal_eph.t0e_1; diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index 6bf14c19e..056dc2901 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -84,7 +84,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, int iter, const prcopt_t *opt, double *var) { const double *lam = nav->lam[obs->sat - 1]; - double PC, P1, P2, P1_P2, P1_C1, P2_C2, gamma; + double PC, P1, P2, P1_P2, P1_C1, P2_C2, gamma_; int i = 0, j = 1, sys; *var = 0.0; @@ -124,7 +124,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, } } } - gamma = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); /* f1^2/f2^2 */ + gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0); /* f1^2/f2^2 */ P1 = obs->P[i]; P2 = obs->P[j]; P1_P2 = nav->cbias[obs->sat-1][0]; @@ -134,7 +134,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* if no P1-P2 DCB, use TGD instead */ if (P1_P2 == 0.0 && (sys & (SYS_GPS | SYS_GAL | SYS_QZS))) { - P1_P2 = (1.0 - gamma) * gettgd(obs->sat, nav); + P1_P2 = (1.0 - gamma_) * gettgd(obs->sat, nav); } if (opt->ionoopt == IONOOPT_IFLC) { /* dual-frequency */ @@ -144,15 +144,30 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, if (obs->code[j] == CODE_L2C) P2 += P2_C2; /* C2->P2 */ /* iono-free combination */ - PC = (gamma * P1 - P2) / (gamma - 1.0); + PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); } else { /* single-frequency */ + if((obs->code[i] == CODE_NONE) && (obs->code[j] == CODE_NONE)){return 0.0;} - if (P1 == 0.0) return 0.0; - if (obs->code[i] == CODE_L1C) P1 += P1_C1; /* C1->P1 */ - PC = P1 - P1_P2 / (1.0 - gamma); - } + else if((obs->code[i] != CODE_NONE) && (obs->code[j] == CODE_NONE)) + { + P1 += P1_C1; /* C1->P1 */ + PC = P1 - P1_P2 / (1.0 - gamma_); + } + else if((obs->code[i] == CODE_NONE) && (obs->code[j] != CODE_NONE)) + { + P2 += P2_C2; /* C2->P2 */ + PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_); + } + /* dual-frequency */ + else + { + P1 += P1_C1; + P2 += P2_C2; + PC = (gamma_ * P1 - P2) / (gamma_ - 1.0); + } + } if (opt->sateph == EPHOPT_SBAS) PC -= P1_C1; /* sbas clock based C1 */ *var = std::pow(ERR_CBIAS, 2.0); @@ -285,12 +300,17 @@ int rescode(int iter, const obsd_t *obs, int n, const double *rs, continue; } /* geometric distance/azimuth/elevation angle */ - if ((r = geodist(rs + i * 6, rr, e)) <= 0.0 || satazel(pos, e, azel + i * 2) < opt->elmin) + if ((r = geodist(rs + i * 6, rr, e)) <= 0.0) { - trace(4, "geodist / satazel error\n"); + trace(4, "geodist error\n"); + continue; + } + double elaux = satazel(pos, e, azel + i * 2); + if(elaux < opt->elmin) + { + trace(4, "satazel error. el = %lf , elmin = %lf\n", elaux, opt->elmin); continue; } - /* psudorange with code bias correction */ if ((P = prange(obs+i, nav, azel+i*2, iter, opt, &vmeas)) == 0.0) { @@ -671,53 +691,6 @@ int pntpos(const obsd_t *obs, int n, const nav_t *nav, const prcopt_t *opt, sol_t *sol, double *azel, ssat_t *ssat, char *msg) { - // int k = 0; - // for (k = 0;kn;k++) - // { - // printf("NAV[%i]: sat %i, %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f , %f \r\n", - // k, - // nav->eph[k].sat, - // nav->eph[k].A, - // nav->eph[k].Adot, - // nav->eph[k].M0, - // nav->eph[k].OMG0, - // nav->eph[k].OMGd, - // nav->eph[k].cic, - // nav->eph[k].cis, - // nav->eph[k].code, - // nav->eph[k].crc, - // nav->eph[k].crs, - // nav->eph[k].cuc, - // nav->eph[k].cus, - // nav->eph[k].deln, - // nav->eph[k].e, - // nav->eph[k].f0, - // nav->eph[k].f1, - // nav->eph[k].f2, - // nav->eph[k].fit, - // nav->eph[k].flag, - // nav->eph[k].i0, - // nav->eph[k].idot, - // nav->eph[k].iodc, - // nav->eph[k].iode, - // nav->eph[k].ndot, - // nav->eph[k].omg, - // nav->eph[k].sat, - // nav->eph[k].sva, - // nav->eph[k].svh, - // nav->eph[k].tgd[0], - // nav->eph[k].toc.sec, - // nav->eph[k].toe.sec, - // nav->eph[k].toes, - // nav->eph[k].ttr.sec, - // nav->eph[k].week); - // } - prcopt_t opt_ = *opt; double *rs, *dts, *var, *azel_, *resp; int i, stat, vsat[MAXOBS] = {0}, svh[MAXOBS]; diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index 1d569997e..a9c74ab55 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -3461,7 +3461,7 @@ double geodist(const double *rs, const double *rr, double *e) /* satellite azimuth/elevation angle ------------------------------------------- * compute satellite azimuth/elevation angle * args : double *pos I geodetic position {lat,lon,h} (rad,m) - * double *e I receiver-to-satellilte unit vevtor (ecef) + * double *e I receiver-to-satellilte unit vector (ecef) * double *azel IO azimuth/elevation {az,el} (rad) (NULL: no output) * (0.0<=azel[0]<2*pi,-pi/2<=azel[1]<=pi/2) * return : elevation angle (rad) diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc index fb30b58ac..d63570996 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc @@ -358,11 +358,6 @@ int hybrid_observables_cc::general_work (int noutput_items __attribute__((unused { d_gnss_synchro_history_queue[i].push_back(in[i][j]); } - //std::cout<<"push["< #include #include +#include #include "control_message_factory.h" -#include "gnss_synchro.h" #include "convolutional.h" @@ -114,7 +114,7 @@ void galileo_e5a_telemetry_decoder_cc::decode_word(double *page_symbols, int fra double page_symbols_deint[frame_length]; // 1. De-interleave - galileo_e5a_telemetry_decoder_cc::deinterleaver(GALILEO_FNAV_INTERLEAVER_ROWS, GALILEO_FNAV_INTERLEAVER_COLS, page_symbols, page_symbols_deint); + deinterleaver(GALILEO_FNAV_INTERLEAVER_ROWS, GALILEO_FNAV_INTERLEAVER_COLS, page_symbols, page_symbols_deint); // 2. Viterbi decoder // 2.1 Take into account the NOT gate in G2 polynomial (Galileo ICD Figure 13, FEC encoder) @@ -127,7 +127,7 @@ void galileo_e5a_telemetry_decoder_cc::decode_word(double *page_symbols, int fra } } int page_bits[frame_length/2]; - galileo_e5a_telemetry_decoder_cc::viterbi_decoder(page_symbols_deint, page_bits); + viterbi_decoder(page_symbols_deint, page_bits); // 3. Call the Galileo page decoder std::string page_String; @@ -197,32 +197,37 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc( { if (GALILEO_FNAV_PREAMBLE.at(i) == '0') { - d_preamble_bits[i] = 1; + d_preambles_bits[i] = 1; } else { - d_preamble_bits[i] = -1; + d_preambles_bits[i] = -1; + } + } + for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) + { + for (int k = 0; k < GALILEO_FNAV_CODES_PER_SYMBOL; k++) + { + d_preamble_samples[(i * GALILEO_FNAV_CODES_PER_SYMBOL) + k] = d_preambles_bits[i]; } } d_sample_counter = 0; - d_state = 0; - d_preamble_lock = false; + d_stat = 0; + corr_value = 0; + d_flag_preamble = false; d_preamble_index = 0; d_flag_frame_sync = false; - d_current_symbol = 0; - d_prompt_counter = 0; - d_symbol_counter = 0; - - d_TOW_at_Preamble = 0; - d_TOW_at_current_symbol = 0; - - d_CRC_error_counter = 0; - d_sign_init = 0; - - d_flag_preamble = false; - d_channel = 0; + d_TOW_at_current_symbol = 0.0; flag_TOW_set = false; + d_CRC_error_counter = 0; + d_channel = 0; + delta_t = 0.0; + d_symbol_counter = 0; + d_prompt_acum = 0.0; + flag_bit_start = false; + new_symbol = false; + required_symbols = GALILEO_FNAV_SYMBOLS_PER_PAGE + GALILEO_FNAV_PREAMBLE_LENGTH_BITS; } @@ -245,265 +250,222 @@ galileo_e5a_telemetry_decoder_cc::~galileo_e5a_telemetry_decoder_cc() int galileo_e5a_telemetry_decoder_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - Gnss_Synchro *out = reinterpret_cast(output_items[0]); // Get the output buffer pointer - const Gnss_Synchro *in = reinterpret_cast(input_items[0]); // Get the input buffer pointer + int preamble_diff = 0; - /* Terminology: Prompt: output from tracking Prompt correlator (Prompt samples) - * Symbol: encoded navigation bits. 1 symbol = 20 samples in E5a - * Bit: decoded navigation bits forming words as described in Galileo ICD - * States: 0 Receiving dummy samples. - * 1 Preamble not locked - * 3 Preamble lock - */ - switch (d_state) + Gnss_Synchro* out = reinterpret_cast(output_items[0]); // Get the output buffer pointer + const Gnss_Synchro* in = reinterpret_cast(input_items[0]); // Get the input buffer pointer + + Gnss_Synchro current_sample; //structure to save the synchronization information and send the output object to the next block + //1. Copy the current tracking output + current_sample = in[0]; + d_symbol_counter++; + if(flag_bit_start) { - case 0: - { - if (in[0].Prompt_I != 0) - { - d_current_symbol += in[0].Prompt_I; - if (d_prompt_counter == GALILEO_FNAV_CODES_PER_SYMBOL - 1) - { - if (d_current_symbol > 0) - { - d_page_symbols[d_symbol_counter] = 1; - } - else - { - d_page_symbols[d_symbol_counter] = -1; - } - d_current_symbol = 0; - d_symbol_counter++; - d_prompt_counter = 0; - if (d_symbol_counter == GALILEO_FNAV_PREAMBLE_LENGTH_BITS - 1) - { - d_state = 1; - } - } - else - { - d_prompt_counter++; - } - } - break; - } - case 1: - { - d_current_symbol += in[0].Prompt_I; - if (d_prompt_counter == GALILEO_FNAV_CODES_PER_SYMBOL - 1) - { - if (d_current_symbol > 0) - { - d_page_symbols[d_symbol_counter] = 1; - } - else - { - d_page_symbols[d_symbol_counter] = -1; - } - // d_page_symbols[d_symbol_counter] = d_current_symbol_float/(float)GALILEO_FNAV_CODES_PER_SYMBOL; - d_current_symbol = 0; - d_symbol_counter++; - d_prompt_counter = 0; - // **** Attempt Preamble correlation **** - bool corr_flag = true; - int corr_sign = 0; // sequence can be found inverted - // check if the preamble starts positive correlated or negative correlated - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS] < 0) // symbols clipping - { - corr_sign = -d_preamble_bits[0]; - } - else - { - corr_sign = d_preamble_bits[0]; - } - // the preamble is fully correlated only if maintains corr_sign along the whole sequence - for (int i = 1; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) - { - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS + i] < 0 && d_preamble_bits[i]+corr_sign != 0) - { - //exit for - corr_flag = false; - break; - } - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS + i] > 0 && d_preamble_bits[i]+corr_sign == 0) - { - //exit for - corr_flag = false; - break; - } - } - // - if (corr_flag == true) // preamble fully correlates - { - d_preamble_index = d_sample_counter - GALILEO_FNAV_CODES_PER_PREAMBLE;//record the preamble sample stamp. Remember correlation appears at the end of the preamble in this design - LOG(INFO) << "Preamble detection in E5a for Galileo satellite " << this->d_satellite << std::endl; - d_symbol_counter = 0; // d_page_symbols start right after preamble and finish at the end of next preamble. - d_state = 2; // preamble lock - } - if (d_symbol_counter >= GALILEO_FNAV_SYMBOLS_PER_PAGE + GALILEO_FNAV_PREAMBLE_LENGTH_BITS) - { - d_symbol_counter = GALILEO_FNAV_PREAMBLE_LENGTH_BITS; // prevents overflow - } - } - else - { - d_prompt_counter++; - } - break; - } - case 2: - { - d_current_symbol += in[0].Prompt_I; - if (d_prompt_counter == GALILEO_FNAV_CODES_PER_SYMBOL - 1) - { - if (d_current_symbol > 0) - { - d_page_symbols[d_symbol_counter] = 1; - } - else - { - d_page_symbols[d_symbol_counter] = -1; - } - // d_page_symbols[d_symbol_counter] = d_current_symbol_float/(float)GALILEO_FNAV_CODES_PER_SYMBOL; - d_current_symbol = 0; - d_symbol_counter++; - d_prompt_counter = 0; - // At the right sample stamp, check preamble synchro - if (d_sample_counter == d_preamble_index + GALILEO_FNAV_CODES_PER_PAGE + GALILEO_FNAV_CODES_PER_PREAMBLE) - { - // **** Attempt Preamble correlation **** - bool corr_flag = true; - int corr_sign = 0; // sequence can be found inverted - // check if the preamble starts positive correlated or negative correlated - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS] < 0) // symbols clipping - { - corr_sign = -d_preamble_bits[0]; - } - else - { - corr_sign = d_preamble_bits[0]; - } - // the preamble is fully correlated only if maintains corr_sign along the whole sequence - for (int i = 1; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) - { - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS + i] < 0 && d_preamble_bits[i]+corr_sign != 0) - { - //exit for - corr_flag = false; - break; - } - if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS + i] > 0 && d_preamble_bits[i]+corr_sign == 0) - { - //exit for - corr_flag = false; - break; - } - } + d_prompt_acum += current_sample.Prompt_I; + if(d_symbol_counter == GALILEO_FNAV_CODES_PER_SYMBOL) + { + current_sample.Prompt_I = d_prompt_acum / static_cast(GALILEO_FNAV_CODES_PER_SYMBOL); + d_symbol_history.push_back(current_sample); //add new symbol to the symbol queue + d_prompt_acum = 0.0; + d_symbol_counter = 0; + new_symbol = true; + } + } + else + { + if(current_sample.Prompt_I < 0.0) + { + d_preamble_init.push_back(1); + } + else + { + d_preamble_init.push_back(-1); + } - if (corr_flag == true) // NEW PREAMBLE RECEIVED. DECODE PAGE - { - d_preamble_index = d_sample_counter - GALILEO_FNAV_CODES_PER_PREAMBLE;//record the preamble sample stamp - // DECODE WORD - decode_word(d_page_symbols, GALILEO_FNAV_SYMBOLS_PER_PAGE - GALILEO_FNAV_PREAMBLE_LENGTH_BITS); - // CHECK CRC - if (d_nav.flag_CRC_test == true) - { - d_CRC_error_counter = 0; - d_flag_preamble = true; //valid preamble indicator (initialized to false every work()) - if (!d_flag_frame_sync) - { - d_flag_frame_sync = true; - DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " - << in[0].Tracking_sample_counter << " [samples]"; - } - d_symbol_counter = 0; // d_page_symbols start right after preamble and finish at the end of next preamble. - } - else - { - d_CRC_error_counter++; - if (d_CRC_error_counter > GALILEO_E5a_CRC_ERROR_LIMIT) - { - LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite; - d_state = 1; - d_symbol_counter = GALILEO_FNAV_PREAMBLE_LENGTH_BITS; // prevents overflow - d_flag_frame_sync = false; - } - else - { - d_symbol_counter = 0; // d_page_symbols start right after preamble and finish at the end of next preamble. - } - } - } - } - } - else - { - d_prompt_counter++; - } - break; - } + if (d_preamble_init.size() == GALILEO_FNAV_CODES_PER_PREAMBLE) + { + std::deque::iterator iter; + int k = 0; + corr_value = 0; + for (iter = d_preamble_init.begin(); iter != d_preamble_init.end(); iter++) + { + corr_value += *iter * d_preamble_samples[k]; + k++; + } + if(abs(corr_value) == GALILEO_FNAV_CODES_PER_PREAMBLE) + { + d_symbol_counter = 0; + flag_bit_start = true; + corr_value = 0; + while(d_preamble_init.size() > 0) + { //Clear preamble correlating queue + d_preamble_init.pop_front(); + } + while(d_symbol_history.size() > 0) + { //Clear symbol queue in order to prevent possible symbol discontinuities + d_symbol_history.pop_front(); + } + LOG(INFO) << "Bit start sync for Galileo E5a satellite " << d_satellite; + } + else + { + d_preamble_init.pop_front(); + } + } + } + d_sample_counter++; //count for the processed samples + consume_each(1); + + d_flag_preamble = false; + + if ((d_symbol_history.size() > required_symbols) && new_symbol) + { + //******* preamble correlation ******** + corr_value = 0; + for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++) + { + if (d_symbol_history.at(i).Prompt_I < 0.0) // symbols clipping + { + corr_value -= d_preambles_bits[i]; + } + else + { + corr_value += d_preambles_bits[i]; + } + } } + //******* frame sync ****************** + if ((d_stat == 0) && new_symbol) //no preamble information + { + if (abs(corr_value) >= GALILEO_FNAV_PREAMBLE_LENGTH_BITS) + { + d_preamble_index = d_sample_counter;//record the preamble sample stamp + LOG(INFO) << "Preamble detection for Galileo E5a satellite " << d_satellite; + d_stat = 1; // enter into frame pre-detection status + } + } + else if ((d_stat == 1) && new_symbol) // posible preamble lock + { + if (abs(corr_value) >= GALILEO_FNAV_PREAMBLE_LENGTH_BITS) + { + //check preamble separation + preamble_diff = d_sample_counter - d_preamble_index; + if (preamble_diff == GALILEO_FNAV_CODES_PER_PAGE) + { + //try to decode frame + LOG(INFO) << "Starting page decoder for Galileo E5a satellite " << d_satellite; + d_preamble_index = d_sample_counter; //record the preamble sample stamp + d_stat = 2; + } + else if (preamble_diff > GALILEO_FNAV_CODES_PER_PAGE) + { + d_stat = 0; // start again + flag_bit_start = false; + LOG(INFO) << "Preamble diff = " << preamble_diff; + } + } + } + else if ((d_stat == 2) && new_symbol) + { + if (d_sample_counter == (d_preamble_index + GALILEO_FNAV_CODES_PER_PAGE)) + { + // NEW Galileo page part is received + // 0. fetch the symbols into an array + int frame_length = GALILEO_FNAV_SYMBOLS_PER_PAGE - GALILEO_FNAV_PREAMBLE_LENGTH_BITS; + double corr_sign = 0.0; + if(corr_value > 0) + { + corr_sign = -1.0; + } + else + { + corr_sign = 1.0; + } + for (int i = 0; i < frame_length; i++) + { + page_symbols[i] = corr_sign * d_symbol_history.at(i + GALILEO_FNAV_PREAMBLE_LENGTH_BITS).Prompt_I; // because last symbol of the preamble is just received now! + } + + //call the decoder + decode_word(page_symbols, frame_length); + if (d_nav.flag_CRC_test == true) + { + d_CRC_error_counter = 0; + d_flag_preamble = true; //valid preamble indicator (initialized to false every work()) + d_preamble_index = d_sample_counter; //record the preamble sample stamp (t_P) + if (!d_flag_frame_sync) + { + d_flag_frame_sync = true; + DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " + << d_symbol_history.at(0).Tracking_sample_counter << " [samples]"; + } + } + else + { + d_CRC_error_counter++; + d_preamble_index = d_sample_counter; //record the preamble sample stamp + if (d_CRC_error_counter > GALILEO_E5A_CRC_ERROR_LIMIT) + { + LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite; + d_flag_frame_sync = false; + d_stat = 0; + flag_bit_start = false; + } + } + } + } + new_symbol = false; // UPDATE GNSS SYNCHRO DATA - Gnss_Synchro current_synchro_data; //structure to save the synchronization information and send the output object to the next block - //1. Copy the current tracking output - current_synchro_data = in[0]; - //2. Add the telemetry decoder information - if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true) + //Add the telemetry decoder information + if (d_flag_preamble and d_nav.flag_TOW_set) //update TOW at the preamble instant //We expect a preamble each 10 seconds (FNAV page period) { if (d_nav.flag_TOW_1 == true) { - d_TOW_at_Preamble = d_nav.FNAV_TOW_1; - d_TOW_at_current_symbol = d_TOW_at_Preamble + (static_cast(GALILEO_FNAV_CODES_PER_PAGE+GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); + d_TOW_at_current_symbol = d_nav.FNAV_TOW_1 + (static_cast(GALILEO_FNAV_CODES_PER_PAGE + GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); d_nav.flag_TOW_1 = false; } - if (d_nav.flag_TOW_2 == true) + else if (d_nav.flag_TOW_2 == true) { - d_TOW_at_Preamble = d_nav.FNAV_TOW_2; - d_TOW_at_current_symbol = d_TOW_at_Preamble + (static_cast(GALILEO_FNAV_CODES_PER_PAGE+GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); + d_TOW_at_current_symbol = d_nav.FNAV_TOW_2 + (static_cast(GALILEO_FNAV_CODES_PER_PAGE + GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); d_nav.flag_TOW_2 = false; } - if (d_nav.flag_TOW_3 == true) + else if (d_nav.flag_TOW_3 == true) { - d_TOW_at_Preamble = d_nav.FNAV_TOW_3; - d_TOW_at_current_symbol = d_TOW_at_Preamble + (static_cast(GALILEO_FNAV_CODES_PER_PAGE+GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); + d_TOW_at_current_symbol = d_nav.FNAV_TOW_3 + (static_cast(GALILEO_FNAV_CODES_PER_PAGE + GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); d_nav.flag_TOW_3 = false; } - if (d_nav.flag_TOW_4 == true) + else if (d_nav.flag_TOW_4 == true) { - d_TOW_at_Preamble = d_nav.FNAV_TOW_4; - d_TOW_at_current_symbol = d_TOW_at_Preamble + (static_cast(GALILEO_FNAV_CODES_PER_PAGE+GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); + d_TOW_at_current_symbol = d_nav.FNAV_TOW_4 + (static_cast(GALILEO_FNAV_CODES_PER_PAGE + GALILEO_FNAV_CODES_PER_PREAMBLE) * GALILEO_E5a_CODE_PERIOD); d_nav.flag_TOW_4 = false; } else { - //this page has no timming information - d_TOW_at_Preamble = d_TOW_at_Preamble + GALILEO_FNAV_SECONDS_PER_PAGE; - d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E5a_CODE_PERIOD; + d_TOW_at_current_symbol += GALILEO_E5a_CODE_PERIOD; } - } else //if there is not a new preamble, we define the TOW of the current symbol { - d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E5a_CODE_PERIOD; + d_TOW_at_current_symbol += GALILEO_E5a_CODE_PERIOD; } //if (d_flag_frame_sync == true and d_nav.flag_TOW_set==true and d_nav.flag_CRC_test == true) - if (d_flag_frame_sync == true and d_nav.flag_TOW_set == true) + if (d_flag_frame_sync and d_nav.flag_TOW_set) { - current_synchro_data.Flag_valid_word = true; + current_sample.Flag_valid_word = true; } else { - current_synchro_data.Flag_valid_word = false; + current_sample.Flag_valid_word = false; } - current_synchro_data.TOW_at_current_symbol_s = floor(d_TOW_at_current_symbol*1000.0)/1000.0; + current_sample.TOW_at_current_symbol_s = floor(d_TOW_at_current_symbol*1000.0)/1000.0; - if(d_dump == true) + if(d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file try @@ -512,20 +474,23 @@ int galileo_e5a_telemetry_decoder_cc::general_work (int noutput_items __attribut unsigned long int tmp_ulong_int; tmp_double = d_TOW_at_current_symbol; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); - tmp_ulong_int = current_synchro_data.Tracking_sample_counter; + tmp_ulong_int = current_sample.Tracking_sample_counter; d_dump_file.write(reinterpret_cast(&tmp_ulong_int), sizeof(unsigned long int)); - tmp_double = d_TOW_at_Preamble; + tmp_double = 0.0; d_dump_file.write(reinterpret_cast(&tmp_double), sizeof(double)); } catch (const std::ifstream::failure & e) { - LOG(WARNING) << "Exception writing observables dump file " << e.what(); + LOG(WARNING) << "Exception writing Galileo E5a Telemetry Decoder dump file " << e.what(); } } - d_sample_counter++; //count for the processed samples - //3. Make the output (copy the object contents to the GNURadio reserved memory) - out[0] = current_synchro_data; - consume_each(1); + // remove used symbols from history + while (d_symbol_history.size() > required_symbols) + { + d_symbol_history.pop_front(); + } + //3. Make the output + out[0] = current_sample; return 1; } diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.h index 46620a86e..4390b3181 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e5a_telemetry_decoder_cc.h @@ -39,6 +39,7 @@ #include #include +#include #include #include "Galileo_E5a.h" #include "concurrent_queue.h" @@ -48,8 +49,7 @@ #include "galileo_almanac.h" #include "galileo_iono.h" #include "galileo_utc_model.h" - -//#include "convolutional.h" +#include "gnss_synchro.h" class galileo_e5a_telemetry_decoder_cc; @@ -85,38 +85,33 @@ private: void decode_word(double *page_symbols, int frame_length); - int d_preamble_bits[GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; - double d_page_symbols[GALILEO_FNAV_SYMBOLS_PER_PAGE + GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; - - double d_current_symbol; - long unsigned int d_symbol_counter; - int d_prompt_counter; - int d_sign_init; - + int d_preambles_bits[GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; + int d_preamble_samples[GALILEO_FNAV_CODES_PER_PREAMBLE]; + std::deque d_preamble_init; + int d_stat; + int d_CRC_error_counter; + int d_channel; + int d_symbol_counter; + int corr_value; + unsigned int required_symbols; long unsigned int d_sample_counter; long unsigned int d_preamble_index; - - bool d_preamble_lock; bool d_flag_frame_sync; - int d_state; - bool d_flag_preamble; - int d_CRC_error_counter; - - // navigation message vars - Galileo_Fnav_Message d_nav; - bool d_dump; - Gnss_Satellite d_satellite; - int d_channel; - - double d_TOW_at_Preamble; - double d_TOW_at_current_symbol; - bool flag_TOW_set; - + bool flag_bit_start; + bool new_symbol; + double d_prompt_acum; + double page_symbols[GALILEO_FNAV_SYMBOLS_PER_PAGE - GALILEO_FNAV_PREAMBLE_LENGTH_BITS]; + double d_TOW_at_current_symbol; + double delta_t; //GPS-GALILEO time offset std::string d_dump_filename; std::ofstream d_dump_file; + std::deque d_symbol_history; + Gnss_Satellite d_satellite; + // navigation message vars + Galileo_Fnav_Message d_nav; }; #endif /* GNSS_SDR_GALILEO_E5A_TELEMETRY_DECODER_CC_H_ */ diff --git a/src/core/system_parameters/Galileo_E1.h b/src/core/system_parameters/Galileo_E1.h index fcd1e5129..a95afd1ca 100644 --- a/src/core/system_parameters/Galileo_E1.h +++ b/src/core/system_parameters/Galileo_E1.h @@ -84,7 +84,6 @@ const int GALILEO_PAGE_TYPE_BITS = 6; const int GALILEO_DATA_JK_BITS = 128; const int GALILEO_DATA_FRAME_BITS = 196; const int GALILEO_DATA_FRAME_BYTES = 25; -//const double GALIELO_E1_CODE_PERIOD = 0.004; const double GALILEO_E1_CODE_PERIOD = 0.004; const std::vector> type({{1,6}}); diff --git a/src/core/system_parameters/Galileo_E5a.h b/src/core/system_parameters/Galileo_E5a.h index d38a2ed14..5663d8dc2 100644 --- a/src/core/system_parameters/Galileo_E5a.h +++ b/src/core/system_parameters/Galileo_E5a.h @@ -52,9 +52,9 @@ const int Galileo_E5a_SYMBOL_RATE_BPS = 50; //!< Galileo E5a symbo const int Galileo_E5a_NUMBER_OF_CODES = 50; -// OBSERVABLE HISTORY DEEP FOR INTERPOLATION +// OBSERVABLE HISTORY DEEP FOR INTERPOLATION AND CRC ERROR LIMIT const int GALILEO_E5A_HISTORY_DEEP = 20; - +const int GALILEO_E5A_CRC_ERROR_LIMIT = 6; // F/NAV message structure @@ -103,7 +103,7 @@ const double FNAV_BGD_1_LSB = TWO_N32; const std::vector> FNAV_E5ahs_1_bit({{154,2}}); const std::vector> FNAV_WN_1_bit({{156,12}}); const std::vector> FNAV_TOW_1_bit({{168,20}}); -const std::vector> FNAV_E5advs_1_bit({{189,1}}); +const std::vector> FNAV_E5advs_1_bit({{188,1}}); // WORD 2 Ephemeris (1/3) const std::vector> FNAV_IODnav_2_bit({{7,10}}); @@ -145,7 +145,7 @@ const std::vector> FNAV_TOW_3_bit({{187,20}}); // WORD 4 Ephemeris (3/3) const std::vector> FNAV_IODnav_4_bit({{7,10}}); -const std::vector> FNAV_Cic_4_bit({{18,16}}); +const std::vector> FNAV_Cic_4_bit({{17,16}}); const double FNAV_Cic_4_LSB = TWO_N29; const std::vector> FNAV_Cis_4_bit({{33,16}}); const double FNAV_Cis_4_LSB = TWO_N29; From bb098efcc8204f9c14f391a535f7fb5846ee771d Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 13 Nov 2017 10:29:36 +0100 Subject: [PATCH 09/12] Minor changes obs sys test --- src/tests/system-tests/obs_system_test.cc | 107 +++++++++++++++++++--- 1 file changed, 94 insertions(+), 13 deletions(-) diff --git a/src/tests/system-tests/obs_system_test.cc b/src/tests/system-tests/obs_system_test.cc index ca0fdfa4c..fad78a813 100644 --- a/src/tests/system-tests/obs_system_test.cc +++ b/src/tests/system-tests/obs_system_test.cc @@ -64,7 +64,7 @@ DEFINE_string(configuration_file, "./default_configuration.conf", "Path of confi DEFINE_string(filename_rinex_true, "./default_rinex.txt", "Path of RINEX true observations"); DEFINE_string(filename_rinex_obs, "default_string", "Path of RINEX true observations"); DEFINE_double(pr_error_mean_max, 25.0, "Maximum mean error in pseudorange"); -DEFINE_double(pr_error_std_max, 5.0, "Maximum standard deviation in pseudorange"); +DEFINE_double(pr_error_std_max, 15.0, "Maximum standard deviation in pseudorange"); DEFINE_double(cp_error_mean_max, 5.0, "Maximum mean error in carrier phase"); DEFINE_double(cp_error_std_max, 2.5, "Maximum standard deviation in carrier phase"); DEFINE_double(dp_error_mean_max, 75.0, "Maximum mean error in Doppler frequency"); @@ -330,7 +330,10 @@ void ObsSystemTest::read_rinex_files( meas_exist = true; } // End of 'if( pointer == roe.obs.end() )' } // end for - sow_prn_ref.insert_rows(sow_prn_ref.n_rows, arma::rowvec({sow_insert, pr_min, prn_min})); + if (!set_pr_min) + { + sow_prn_ref.insert_rows(sow_prn_ref.n_rows, arma::rowvec({sow_insert, pr_min, prn_min})); + } } // end while } // End of 'try' block catch(const gpstk::FFStreamError& e) @@ -405,10 +408,10 @@ void ObsSystemTest::time_alignment_diff_cp( index_ = arma::find(iter_meas->col(0) < iter_ref->at(iter_ref->n_rows - 1, 0)); arma::uword index_max = arma::max(index_); mat_aux = iter_meas->rows(index_min, index_max); - mat_aux.col(1) -= arma::min(mat_aux.col(1)); + mat_aux.col(1) -= mat_aux.col(1)(0); arma::vec ref_aligned; arma::interp1(iter_ref->col(0), iter_ref->col(1), mat_aux.col(0), ref_aligned); - ref_aligned -= arma::min(ref_aligned); + ref_aligned -= ref_aligned(0); *iter_diff = ref_aligned - mat_aux.col(1); } iter_ref++; @@ -543,13 +546,27 @@ void ObsSystemTest::compute_pseudorange_error( { if(!iter_diff->is_empty()) { + while(iter_diff->has_nan()) + { + bool nan_found = false; + int k_aux = 0; + while(!nan_found) + { + if(!iter_diff->row(k_aux).is_finite()) + { + nan_found = true; + iter_diff->shed_row(k_aux); + } + k_aux++; + } + } double d_mean = std::sqrt(arma::mean(arma::square(*iter_diff))); means.push_back(d_mean); double d_stddev = arma::stddev(*iter_diff); stddevs.push_back(d_stddev); prns.push_back(static_cast(prn_id)); std::cout << "-- RMS pseudorange difference for sat " << prn_id << ": " << d_mean; - std::cout << " +/- " << d_stddev; + std::cout << ". Std. dev.: " << d_stddev; std::cout << " [m]" << std::endl; EXPECT_LT(d_mean, error_th_mean); EXPECT_LT(d_stddev, error_th_std); @@ -581,8 +598,20 @@ void ObsSystemTest::compute_pseudorange_error( g1.set_ylabel("Pseudorange error [m]"); g1.plot_xy(prns, means, "RMS error"); g1.plot_xy(prns, stddevs, "Standard deviation"); - //g1.savetops("FFT_execution_times_extended"); - //g1.savetopdf("FFT_execution_times_extended", 18); + size_t char_pos = signal_name.find(" "); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find(" "); + } + char_pos = signal_name.find("/"); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find("/"); + } + g1.savetops("Pseudorange_error_" + signal_name); + g1.savetopdf("Pseudorange_error_" + signal_name, 18); g1.showonscreen(); // window output } catch (const GnuplotException & ge) @@ -608,13 +637,27 @@ void ObsSystemTest::compute_carrierphase_error( { if(!iter_diff->is_empty()) { + while(iter_diff->has_nan()) + { + bool nan_found = false; + int k_aux = 0; + while(!nan_found) + { + if(!iter_diff->row(k_aux).is_finite()) + { + nan_found = true; + iter_diff->shed_row(k_aux); + } + k_aux++; + } + } double d_mean = std::sqrt(arma::mean(arma::square(*iter_diff))); means.push_back(d_mean); double d_stddev = arma::stddev(*iter_diff); stddevs.push_back(d_stddev); prns.push_back(static_cast(prn_id)); std::cout << "-- RMS carrier phase difference for sat " << prn_id << ": " << d_mean; - std::cout << " +/- " << d_stddev; + std::cout << ". Std. dev.: " << d_stddev; std::cout << " whole cycles" << std::endl; EXPECT_LT(d_mean, error_th_mean); EXPECT_LT(d_stddev, error_th_std); @@ -646,8 +689,20 @@ void ObsSystemTest::compute_carrierphase_error( g1.set_ylabel("Carrier phase error [whole cycles]"); g1.plot_xy(prns, means, "RMS error"); g1.plot_xy(prns, stddevs, "Standard deviation"); - //g1.savetops("FFT_execution_times_extended"); - //g1.savetopdf("FFT_execution_times_extended", 18); + size_t char_pos = signal_name.find(" "); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find(" "); + } + char_pos = signal_name.find("/"); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find("/"); + } + g1.savetops("Carrier_phase_error_" + signal_name); + g1.savetopdf("Carrier_phase_error_" + signal_name, 18); g1.showonscreen(); // window output } catch (const GnuplotException & ge) @@ -673,13 +728,27 @@ void ObsSystemTest::compute_doppler_error( { if(!iter_diff->is_empty()) { + while(iter_diff->has_nan()) + { + bool nan_found = false; + int k_aux = 0; + while(!nan_found) + { + if(!iter_diff->row(k_aux).is_finite()) + { + nan_found = true; + iter_diff->shed_row(k_aux); + } + k_aux++; + } + } double d_mean = std::sqrt(arma::mean(arma::square(*iter_diff))); means.push_back(d_mean); double d_stddev = arma::stddev(*iter_diff); stddevs.push_back(d_stddev); prns.push_back(static_cast(prn_id)); std::cout << "-- RMS Doppler difference for sat " << prn_id << ": " << d_mean; - std::cout << " +/- " << d_stddev; + std::cout << ". Std. dev.: " << d_stddev; std::cout << " [Hz]" << std::endl; EXPECT_LT(d_mean, error_th_mean); EXPECT_LT(d_stddev, error_th_std); @@ -711,8 +780,20 @@ void ObsSystemTest::compute_doppler_error( g1.set_ylabel("Doppler error [Hz]"); g1.plot_xy(prns, means, "RMS error"); g1.plot_xy(prns, stddevs, "Standard deviation"); - //g1.savetops("FFT_execution_times_extended"); - //g1.savetopdf("FFT_execution_times_extended", 18); + size_t char_pos = signal_name.find(" "); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find(" "); + } + char_pos = signal_name.find("/"); + while(char_pos != std::string::npos) + { + signal_name.replace(char_pos, 1, "_"); + char_pos = signal_name.find("/"); + } + g1.savetops("Doppler_error_" + signal_name); + g1.savetopdf("Doppler_error_" + signal_name, 18); g1.showonscreen(); // window output } catch (const GnuplotException & ge) From 2728690cddb3dc4c4343692a22eb2be7713ffc16 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Thu, 30 Nov 2017 15:35:49 +0100 Subject: [PATCH 10/12] Adding GPS L5 signal definition file --- src/core/system_parameters/GPS_L5.h | 179 ++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/core/system_parameters/GPS_L5.h diff --git a/src/core/system_parameters/GPS_L5.h b/src/core/system_parameters/GPS_L5.h new file mode 100644 index 000000000..e6d6589d8 --- /dev/null +++ b/src/core/system_parameters/GPS_L5.h @@ -0,0 +1,179 @@ +/*! + * \file GPS_L2C.h + * \brief Defines system parameters for GPS L5 signal + * \author Javier Arribas, 2017. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2017 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GNSS_SDR_GPS_L5_H_ +#define GNSS_SDR_GPS_L5_H_ + +#include +#include +#include // std::pair +#include "MATH_CONSTANTS.h" +#include "gnss_frequencies.h" + +// Physical constants +const double GPS_L5_C_m_s = 299792458.0; //!< The speed of light, [m/s] +const double GPS_L5_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] +const double GPS_L5_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E +const double GPS_L5_TWO_PI = 6.283185307179586;//!< 2Pi as defined in IS-GPS-200E +const double GPS_L5_OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Earth rotation rate, [rad/s] +const double GPS_L5_GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] +const double GPS_L5_F = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] + + +// carrier and code frequencies +const double GPS_L5_FREQ_HZ = FREQ5; //!< L2 [Hz] + +const double GPS_L5i_CODE_RATE_HZ = 10.23e6; //!< GPS L5i code rate [chips/s] +const int GPS_L5i_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] +const double GPS_L5i_PERIOD = 0.001; //!< GPS L2 M code period [seconds] + +const double GPS_L5q_CODE_RATE_HZ = 10.23e6; //!< GPS L5i code rate [chips/s] +const int GPS_L5q_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] +const double GPS_L5q_PERIOD = 0.001; //!< GPS L2 M code period [seconds] + + +const int32_t GPS_L5i_INIT_REG[210] = + {266, 365, 804, 1138, + 1509, 1559, 1756, 2084, + 2170, 2303, 2527, 2687, + 2930, 3471, 3940, 4132, + 4332, 4924, 5343, 5443, + 5641, 5816, 5898, 5918, + 5955, 6243, 6345, 6477, + 6518, 6875, 7168, 7187, + 7329, 7577, 7720, 7777, + 8057, 5358, 3550, 3412, + 819, + 4608, 3698, 962, 3001, + 4441, 4937, 3717, 4730, + 7291, 2279, 7613, 5723, + 7030, 1475, 2593, 2904, + 2056, 2757, 3756, 6205, + 5053, 6437, + 7789, 2311, 7432, 5155, + 1593, 5841, 5014, 1545, + 3016, 4875, 2119, 229, + 7634, 1406, 4506, 1819, + 7580, 5446, 6053, 7958, + 5267, 2956, 3544, 1277, + 2996, 1758, 3360, 2718, + 3754, 7440, 2781, 6756, + 7314, 208, 5252, 696, + 527, 1399, 5879, 6868, + 217, 7681, 3788, 1337, + 2424, 4243, 5686, 1955, + 4791, 492, 1518, 6566, + 5349, 506, 113, 1953, + 2797, 934, 3023, 3632, + 1330, 4909, 4867, 1183, + 3990, 6217, 1224, 1733, + 2319, 3928, 2380, 841, + 5049, 7027, 1197, 7208, + 8000, 152, 6762, 3745, + 4723, 5502, 4796, 123, + 8142, 5091, 7875, 330, + 5272, 4912, 374, 2045, + 6616, 6321, 7605, 2570, + 2419, 1234, 1922, 4317, + 5110, 825, 958, 1089, + 7813, 6058, 7703, 6702, + 1714, 6371, 2281, 1986, + 6282, 3201, 3760, 1056, + 6233, 1150, 2823, 6250, + 645, 2401, 1639, 2946, + 7091, 923, 7045, 6493, + 1706, 5836, 926, 6086, + 950, 5905, 3240, 6675, + 3197, 1555, 3589, 4555, + 5671, 6948, 4664, 2086, + 5950, 5521, 1515}; + + +const int32_t GPS_L5q_INIT_REG[210] = + { + 1701, 323, 5292, 2020, + 5429, 7136, 1041, 5947, + 4315, 148, 535, 1939, + 5206, 5910, 3595, 5135, + 6082, 6990, 3546, 1523, + 4548, 4484, 1893, 3961, + 7106, 5299, 4660, 276, + 4389, 3783, 1591, 1601, + 749, 1387, 1661, 3210, + 708, + 4226, 5604, 6375, 3056, + 1772, 3662, 4401, 5218, + 2838, 6913, 1685, 1194, + 6963, 5001, 6694, 991, + 7489, 2441, 639, 2097, + 2498, 6470, 2399, 242, + 3768, 1186, + 5246, 4259, 5907, 3870, + 3262, 7387, 3069, 2999, + 7993, 7849, 4157, 5031, + 5986, 4833, 5739, 7846, + 898, 2022, 7446, 6404, + 155, 7862, 7795, 6121, + 4840, 6585, 429, 6020, + 200, 1664, 1499, 7298, + 1305, 7323, 7544, 4438, + 2485, 3387, 7319, 1853, + 5781, 1874, 7555, 2132, + 6441, 6722, 1192, 2588, + 2188, 297, 1540, 4138, + 5231, 4789, 659, 871, + 6837, 1393, 7383, 611, + 4920, 5416, 1611, 2474, + 118, 1382, 1092, 7950, + 7223, 1769, 4721, 1252, + 5147, 2165, 7897, 4054, + 3498, 6571, 2858, 8126, + 7017, 1901, 181, 1114, + 5195, 7479, 4186, 3904, + 7128, 1396, 4513, 5967, + 2580, 2575, 7961, 2598, + 4508, 2090, 3685, 7748, + 684, 913, 5558, 2894, + 5858, 6432, 3813, 3573, + 7523, 5280, 3376, 7424, + 2918, 5793, 1747, 7079, + 2921, 2490, 4119, 3373, + 977, 681, 4273, 5419, + 5626, 1266, 5804, 2414, + 6444, 4757, 427, 5452, + 5182, 6606, 6531, 4268, + 3115, 6835, 862, 4856, + 2765, 37, 1943, 7977, + 2512, 4451, 4071}; + + + +#endif /* GNSS_SDR_GPS_L5_H_ */ From 0a1e1e88c146e687cb44d989b2f120e2c2deaaa4 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 30 Nov 2017 21:48:57 +0100 Subject: [PATCH 11/12] Minor fixes --- src/tests/common-files/gnuplot_i.h | 2 -- src/tests/test_main.cc | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/tests/common-files/gnuplot_i.h b/src/tests/common-files/gnuplot_i.h index 3e9b966c6..0996924d2 100644 --- a/src/tests/common-files/gnuplot_i.h +++ b/src/tests/common-files/gnuplot_i.h @@ -1890,7 +1890,6 @@ bool Gnuplot::get_program_path() if (path == NULL) { throw GnuplotException("Path is not set"); - return false; } else { @@ -2036,7 +2035,6 @@ std::string Gnuplot::create_tmpfile(std::ofstream &tmp) std::ostringstream except; except << "Cannot create temporary file \"" << name << "\""; throw GnuplotException(except.str()); - return ""; } tmp.open(name); diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index ce8de7097..efb2ee422 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -70,9 +70,7 @@ DECLARE_string(log_dir); #include "unit-tests/arithmetic/code_generation_test.cc" #include "unit-tests/arithmetic/fft_length_test.cc" #include "unit-tests/arithmetic/fft_speed_test.cc" -#if MATIO_TEST #include "unit-tests/arithmetic/matio_test.cc" -#endif #include "unit-tests/control-plane/file_configuration_test.cc" #include "unit-tests/control-plane/in_memory_configuration_test.cc" From e50700c71c7d37417b3f54c0130b857c9928feea Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 30 Nov 2017 21:55:44 +0100 Subject: [PATCH 12/12] Minor fixes --- src/core/system_parameters/GPS_L5.h | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/core/system_parameters/GPS_L5.h b/src/core/system_parameters/GPS_L5.h index e6d6589d8..23c9fbc73 100644 --- a/src/core/system_parameters/GPS_L5.h +++ b/src/core/system_parameters/GPS_L5.h @@ -1,5 +1,5 @@ /*! - * \file GPS_L2C.h + * \file GPS_L5.h * \brief Defines system parameters for GPS L5 signal * \author Javier Arribas, 2017. jarribas(at)cttc.es * @@ -33,31 +33,29 @@ #define GNSS_SDR_GPS_L5_H_ #include -#include -#include // std::pair #include "MATH_CONSTANTS.h" #include "gnss_frequencies.h" // Physical constants -const double GPS_L5_C_m_s = 299792458.0; //!< The speed of light, [m/s] -const double GPS_L5_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] -const double GPS_L5_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E -const double GPS_L5_TWO_PI = 6.283185307179586;//!< 2Pi as defined in IS-GPS-200E +const double GPS_L5_C_m_s = 299792458.0; //!< The speed of light, [m/s] +const double GPS_L5_C_m_ms = 299792.4580; //!< The speed of light, [m/ms] +const double GPS_L5_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E +const double GPS_L5_TWO_PI = 6.283185307179586; //!< 2Pi as defined in IS-GPS-200E const double GPS_L5_OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Earth rotation rate, [rad/s] const double GPS_L5_GM = 3.986005e14; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2] const double GPS_L5_F = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] // carrier and code frequencies -const double GPS_L5_FREQ_HZ = FREQ5; //!< L2 [Hz] +const double GPS_L5_FREQ_HZ = FREQ5; //!< L2 [Hz] const double GPS_L5i_CODE_RATE_HZ = 10.23e6; //!< GPS L5i code rate [chips/s] -const int GPS_L5i_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] -const double GPS_L5i_PERIOD = 0.001; //!< GPS L2 M code period [seconds] +const int GPS_L5i_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] +const double GPS_L5i_PERIOD = 0.001; //!< GPS L2 M code period [seconds] const double GPS_L5q_CODE_RATE_HZ = 10.23e6; //!< GPS L5i code rate [chips/s] -const int GPS_L5q_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] -const double GPS_L5q_PERIOD = 0.001; //!< GPS L2 M code period [seconds] +const int GPS_L5q_CODE_LENGTH_CHIPS = 10230; //!< GPS L5i code length [chips] +const double GPS_L5q_PERIOD = 0.001; //!< GPS L2 M code period [seconds] const int32_t GPS_L5i_INIT_REG[210] =